2013-06-06 19 views
0

我要瘋了,Facebook的access_tokens在PHP和JS不同?

我不明白如何處理令牌的事情。我使用php sdk進行web登錄。這工作,我可以

$facebook->api('/me'); 

從用戶等

的數據,但還是很短的時間我得到的* FB錯誤後:

OAuthException: An active access token must be used to query information about the current user. 

即使用戶仍然登錄。當我斷開並再次登錄facebook時,我沒有得到新的令牌(我認爲是因爲cookie仍然活動?)

當我刪除一段時間內運行的所有Cookie。

當我檢查回來JS SDK

FB.getLoginStatus(function(response){FB.api('/me', function(response) {});}); 

我一直有一個積極的和的access_token在它我可以調用API,但僅限於...

爲什麼我不能用同樣的道理在PHP和JS或爲什麼他們不同?

請幫幫我。

編輯

解釋它更好。在php中,access_token從例如'CDAtEg'等'148234'等(不知道爲什麼)。如果我在PHP中執行api請求,我得到了OAuthException,但在js SDK中,舊的Token'CDAtEg'仍然是活動的,並且我得到了user_data,直到令牌被執行。

爲什麼我不能再次在php中使用相同的標記,爲什麼它被刪除?我找不到原因。

EDIT 2

謝謝你的想法而已。我現在發現了兩件事。首先,當我保存我從JS SDK獲得的令牌時,使用它與

$facebook->setAccessToken() 

它似乎工作到目前爲止。其次,由於phwd在下面發佈,我從php獲得的user_access標記在2,3分鐘後被刪除。我怎樣才能找到這個問題的根源?

+0

經過一段時間...他們應該持續兩個小時!你收到代幣時是否檢查過期? –

+0

我做的兩個API調用同時在PHP中我得到一個令牌錯誤在JS不是,即使我使用相同的標記。所以它沒有過期。 –

+0

https://developers.facebook.com/roadmap/offline-access-removal/ – CBroe

回答

1

這兩個令牌因爲它們是相同的用戶令牌而終止。

在PHP SDK,如果令牌到期或者被拋出了一些錯誤,PHP SDK將默認標記設置爲應用程序令牌

https://github.com/facebook/facebook-php-sdk/blob/master/src/base_facebook.php#L389

/** 
    * Determines the access token that should be used for API calls. 
    * The first time this is called, $this->accessToken is set equal 
    * to either a valid user access token, or it's set to the application 
    * access token if a valid user access token wasn't available. Subsequent 
    * calls return whatever the first call returned. 
    * 
    * @return string The access token 
    */ 
    public function getAccessToken() { 
    if ($this->accessToken !== null) { 
     // we've done this already and cached it. Just return. 
     return $this->accessToken; 
    } 

    // first establish access token to be the application 
    // access token, in case we navigate to the /oauth/access_token 
    // endpoint, where SOME access token is required. 
    $this->setAccessToken($this->getApplicationAccessToken()); 
    $user_access_token = $this->getUserAccessToken(); 
    if ($user_access_token) { 
     $this->setAccessToken($user_access_token); 
    } 

    return $this->accessToken; 
    } 

因此,你必須引入登錄在PHP中進行處理以確保不會進行調用,除非提供有效的用戶訪問令牌。

在JS SDK中,除非明確設置,否則大多數設置都會在令牌過期後通過登錄推送用戶。

正如您所描述的那樣,似乎錯誤會推動PHP SDK使用默認應用程序令牌。

你甚至可以肯定的是,在JS SDK使用令牌的用戶訪問將在PHP SDK 工作,如果它確實仍然活躍,通過將其設定

$facebook->setAccessToken('YOUR_ACCESS_TOKEN_IN_JS_SDK'); 

一旦這工作那麼錯誤你的代碼中的其他地方(你沒有提供)。

+0

啊,現在我向前邁進了一步。當我在PHP中設置令牌時,我得到'錯誤驗證訪問令牌:會話無效,因爲用戶註銷。' ['code'] => 190 ['error_subcode'] => 467.但用戶沒有註銷,只有當用戶拒絕publish_actions權限時才進行測試。也許這是我失去了會話和令牌的原因? –

0

經過一段時間間隔訪問令牌過期。 Facebook爲每個會話提供新的訪問令牌。每個用戶和每個會話的訪問令牌並不總是相同的。

+0

感謝您的快速回答,但我不明白你是什麼意思,爲什麼我在PHP中獲取消息,但不是在JS中,以及我如何當它不在時,可以在PHP中獲得一個令牌。 –

+1

另外檢查https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens/ –

+0

嗯這是非常古老的,但仍然uptodate?似乎並非如此。 –

0

BUT when i check back with facebook SDK

這是因爲FB.api檢查你的access_token有效,如果無效,更新它。

在php中,您需要手動執行此操作。更多與代碼示例PHP SDK: How do I capture the access token after user auths app?

+0

意味着我不能使用javascript令牌並將其設置爲php? wt * ... –

+1

@ RuvenJR.Maerson我認爲你不能相信任何可以改變的任何標記。 – nk9

+0

但這是我從facebook響應直接得到的令牌,並且它與我在getAcesstoken()中獲得的相同(在設置時開始)。這就是爲什麼我仍然不明白這兩點之間有什麼區別。 –