2011-05-15 267 views
5

我已經設置了一個Canvas頁面,它在單擊表單提交按鈕時創建了一個FB.login。在以下請求期間,它嘗試通過$ facebook-> api('/ me')(Github的最新API版本)訪問用戶數據。它適用於Firefox和Chrome瀏覽器,但不適用於Safari和IE,API失敗且需要「auth令牌」。有沒有人已經有這個問題,或有什麼可能會導致它的想法?使用PHP API的FB.login

BR菲利普

編輯:

我打電話的FB.login窗體的單擊事件裏面提交按鈕:

$('.form-submit', this).click(function() { 
    FB.getLoginStatus(function(response) { 
    if (response.session) { 
     form.submit(); 
    } else { 
     FB.login(function(response) { 
     if(response.session && (permissions == '' || response.perms)) { 
      form.submit(); 
     } 
     else { 
     } 
     },{perms:permissions}); 
    } 
    }); 
    return false; 
}); 

在服務器端的簡單構造PHP-API對象和嘗試獲取用戶數據:

$facebook = new Facebook(array(
    'appId' => $appid, 
    'secret' => $appsecret, 
    'cookie' => TRUE, 
)); 
if ($facebook) { 
    try { 
    $me = $api->api('/me'); 
    } 
    catch (Exception $exc) { 
    // Failure in Safari and IE due to invalid auth token 
    } 
} 

signed_request在hidde中傳遞n表單元素。

+0

親愛的你應該提供你的所有代碼。問題可能在你的最後。這不是一個常見問題 – 2011-05-15 14:09:41

+0

你能提供一些代碼嗎?我想這是關係到你的會議/ cookies或一些js popup沒有顯示出來..你有沒有在你的Safari瀏覽器的控制檯中的錯誤? – dwarfy 2011-05-15 14:31:30

+0

剛剛在上面添加了我的代碼。有一些「不安全請求」 - 警告,但他們總是出現在臉書上。 – 2011-05-15 14:35:07

回答

5

我有很多麻煩JS FB登錄的東西。我建議使用更簡單的重定向登錄使用oauth和php fb api中的getLoginUrl函數。

所以基本上你是從PHP做的,你檢查你是否有你的會話,如果沒有,你使用getLoginUrl並重定向到那個頁面,你的使用將被重定向到你的應用/ )。

這有幫助嗎?我真的失去了HOURS,試圖讓FB JS登錄工作在任何瀏覽器上,而我無法做到,從那以後,我在所有應用中切換到了簡單的重定向登錄方法,並取得了圓滿的成功。

+0

非常感謝!它不像彈出式登錄那樣「美麗」,但至少它可以在任何地方使用。 – 2011-05-15 15:18:19

+0

完全同意這一點。我後悔使用Facebook Javascript SDK。我花了很多時間研究Facebook瀏覽器阻止的某個瀏覽器窗口。最後,我決定使用重定向一個解決方案。 – David 2014-11-08 12:36:24

8

我有同樣的問題,我已經在下面列出了一個解決方案。

我相信這種情況發生的原因是因爲在Javascript登錄嘗試你的服務器永遠不會收到任何訪問令牌。 Javascript只是在瀏覽器和Facebook.com之間傳遞數據,所以你的服務器不知道認證狀態是什麼。當頁面刷新時,您的服務器將只接收新的訪問令牌;這是Facebook交出訪問令牌的地方。

繼承人我的解決方案。 通過FB.login成功登錄後,您將收到響應對象,並在其中包含access_token。您需要做的只是以某種方式將此訪問令牌傳遞給您的腳本。以下是一個示例:

// Hold the access token 
var js_access_token = ""; 

// Connect to facebook 
FB.login(function(response) { 
    if (response.session) { 
    if (response.perms) { 
     // user is logged in and granted some permissions. 
     // Save the access token 
     js_access_token = response.session.access_token; 
     // Do stuff on login 
    } 
    } 
}); 

然後,將訪問令牌與任何請求一起包含在內。我選擇了一個ajax的例子。

// Communication back to server. 
$.ajax({ 
    url: 'myurl.php', 
    data: { 
    js_access_token: js_access_token // Including the js_access_token 
    }, 
    success: function(data) { 
    console.log(data); 
} 
}); 

在你的PHP然後需要有一些東西,看起來像這樣:

$facebook = new Facebook(array(
    'appId' => $appid, 
    'secret' => $appsecret, 
    'cookie' => TRUE, 
)); 
if ($facebook) { 

    // If we get the access token from javascript use it instead 
    if (isset($_REQUEST['js_access_token']) && $_REQUEST['js_access_token']) { 
    $facebook->setAccessToken($_REQUEST['js_access_token']); 
    } 

    try { 
    $me = $api->api('/me'); 
    } 
    catch (Exception $exc) { 
    // Failure in Safari and IE due to invalid auth token 
    } 
} 

希望這有助於

+0

這個作品,謝謝! – artvolk 2011-07-06 17:55:23

+3

這是錯誤的!我們不應該在未加密的客戶端和服務器之間發送訪問令牌。請閱讀以下新認證方法:https://developers.facebook.com/blog/post/525/ – oliland 2011-08-06 00:05:42

+0

@oliland謝謝。鏈接爲+1 – 2012-02-13 18:23:08

0

我喜歡康納爾的回答,因爲我不得不從客戶端通過我的訪問令牌因爲它在Safari中不工作(我假設的cookie問題)。但這是一個老問題,所以有些事情必須改變。現在的變量是不同的,正如oliland指出的那樣,我們不應該將訪問令牌作爲GET參數發送。

總之,這裏是我結束了的情況下,它可以幫助任何人

<a id="start-button" href="#">Start</a> 
<form id="entry-form" action="nextpageurl" method="post"> 
    <input type="hidden" name="access_token" /> 
</form> 

<script> 
$(document).ready(function() { 
    $('#start-button').click(function(e) { 
     e.preventDefault(); 
     FB.login(function (response) { 
      if (response.authResponse) { 
       $('#entry-form input').val(response.authResponse.accessToken); 
       $('#entry-form').submit(); 
      } else { 
       alert('Permissions required'); 
      } 
     }, {}); 
    }); 
}); 
</script> 

,然後在PHP中,幾乎一樣的康納爾的答案,但得到從$ _POST變種令牌。