facebook access_tokens在php和js diffeerent?

时间:2013-06-06 07:57:51

标签: php javascript facebook facebook-graph-api

我在这里疯了,

我不明白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分钟后被删除。我怎样才能找到这个问题的根源?

3 个答案:

答案 0 :(得分: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');

一旦这样做,那么代码中的其他地方的错误(你没有提供)。

答案 1 :(得分:0)

经过一段时间间隔访问令牌过期后。 Facebook为每个会话提供新的访问令牌。每个用户和每个会话的访问令牌并不总是相同。

答案 2 :(得分:0)

  

但是当我用facebook SDK检查时

这是因为FB.api检查是您的access_token有效且无效的更新。

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