簡體   English   中英

Facebook的access_tokens在PHP和JS的diffeerent?

[英]facebook access_tokens in php and js diffeerent?

我要瘋了

我不明白Facebook如何處理令牌的事情。 我使用php sdk進行網絡登錄。 這可行,我可以接受

$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中,舊令牌'CDAtEg'仍處於活動狀態,並且我會獲得user_data直到令牌過期。

為什么我不能在php中再次使用相同的令牌,為什么將其刪除? 我沒有找到原因。

編輯2

到目前為止,謝謝您的想法。 我現在發現了兩件事。 首先,當我保存令牌時,我從JS SDK中獲取並用於

$facebook->setAccessToken()

到目前為止,它似乎仍然有效。 其次,如phwd所述,我從php獲得的user_access令牌下方發布了2,3分鍾后被刪除。 我如何找到此問題的根源?

這兩個令牌都將到期,因為它們是相同的用戶令牌。

在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');

一旦成功,錯誤就會出現在代碼的其他地方(您尚未提供)。

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

但是當我使用Facebook SDK進行檢查時

發生這種情況是因為FB.api檢查是您的access_token有效,如果無效,請對其進行更新。

在php中,您需要手動執行此操作。 有關代碼示例的更多信息PHP SDK:在用戶驗證應用程序后如何捕獲訪問令牌?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM