0

我在这里疯了,

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

4

3 回答 3

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

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

于 2013-06-06T14:20:40.807 回答
0

但是当我用 facebook SDK 回来查看时

发生这种情况是因为FB.api检查是access_token有效的,如果无效则更新它。

在 php 中,您需要手动执行此操作。更多代码示例 PHP SDK:如何在用户授权应用程序后捕获访问令牌?

于 2013-06-06T08:53:05.680 回答
0

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

于 2013-06-06T08:01:16.767 回答