【问题标题】:Getting long-lived access token with setExtendedAccessToken() returns short lived token使用 setExtendedAccessToken() 获取长期访问令牌会返回短期令牌
【发布时间】:2012-08-25 04:28:14
【问题描述】:

我尝试使用

获取扩展的长期访问令牌
$facebook->setExtendedAccessToken();
$access_token = $facebook->getAccessToken();

查看 SDK 后,我发现 setExtendedAccessToken() 函数正在设置长寿命访问令牌

protected static $kSupportedKeys =
array('state', 'code', 'access_token', 'user_id');

$this->setPersistentData(
  'access_token', $response_params['access_token']
);

并且 getAccessToken() 从

返回短期访问令牌
protected $accessToken

那么 setExtendedAccessToken() 不返回任何东西的目的是什么?

【问题讨论】:

  • 我也希望有人可以对这个问题给出任何有用的答案。

标签: php facebook-php-sdk


【解决方案1】:

在进一步尝试探索base_facebook.php 之后,我发现了以下内容:

  • setExtendedAccessToken(); 将交换一个短期访问令牌,而 Facebook 返回一个适当的扩展访问令牌。
  • setExtendedAccessToken(); 将其保存在持久数据缓存中,但这并不意味着getAccessToken(); 可以访问它,因为getAccessToken(); 不会查询持久缓存。此外,该类似乎将持久数据视为“故障安全”,并且仅在所有其他检索数据的尝试都失败时(即在检查 signed_request 并解析 code 之后)才使用它。
  • 在我们的例子中,通过setExtendedAccessToken(); 返回的访问令牌是最新的访问令牌,因此我进行了修复。在setExtendedAccessToken();的底部添加以下行

    // Also set the publically accessible access token value to this new extended token

    $this->accessToken = $response_params['access_token'];

  • 警告:尽管我们现在有了新的扩展访问令牌,但后续对 Facebook 的查询以检索访问令牌(例如在页面刷新后)将返回相同的旧的短期访问令牌访问令牌。 *捂脸*

  • 即使在用户注销(从而导致短期令牌过期)并重新登录后,Facebook 也会再次返回一个短期访问令牌。
  • 但是,即使是这种情况,setExtendedAccessToken(); 也会返回您之前检索到的相同扩展访问令牌。该令牌仍可用于查询用户信息。

所以,这看起来像一个 Facebook 错误,尽管我很讨厌这样说。我们可以通过我上面详述的 hack 来绕过它,任何后续的获取访问令牌的调用都只会返回一个短暂的访问令牌,可以一次又一次地交换相同的扩展访问令牌。


原答案

根据this answer,新的访问令牌保存在持久数据中(正如您在问题中也指出的那样),可以通过$facebook->getAccessToken();访问。

两个相关说明:

  • This page 还提到,当短期访问令牌交换为扩展访问令牌时,令牌本身可能会或可能不会更改,尽管到期时间应该已更新以反映更长的到期时间。也许当您调用$facebook->getAccessToken(); 时,您只是取回了相同的令牌,但它的有效期已经改变?
  • 每位用户每天只能调用一次将短期访问令牌换成延长访问令牌。我不知道这是为什么,而且我不知道如果用户决定取消对您的应用的授权并重新授权,此计数器是否会重置。

来自 Facebook 文档:

当用户使用现有的、有效的、短期用户 access_token 访问您的网站时,您可以选择延长该访问令牌的到期时间。 我们的平台每天只会延长一次过期时间,因此即使用户一天多次访问您的网站,令牌也会在第一次请求时延长。 (强调我的)

我相信是这样,因为草率的程序员会在每一个可能的机会打电话给$facebook->setExtendedAccessToken();,希望总能检索到一个扩展的访问令牌。 (而不是 preferred 行为,如果您当前拥有的是短期访问令牌,则只会调用 $facebook->setExtendedAccessToken(); - 但除非您保存了到期日期,否则您将如何判断,它本身并不那么可靠......!)

我的假设是,如果用户取消对应用程序的授权,或者令牌无效,限制将重置,并且您将能够在传递短期访问令牌时再次检索扩展访问令牌。但是,这需要进一步测试,因此请对本段持保留态度。

【讨论】:

  • Julian H. Lam 当我不使用 facebook chrome 时它似乎可以工作,也许他们的意思是它适用于使用 facebook 的网页,而不是显示在 fb 内的网络应用程序铬。
【解决方案2】:

@朱利安。非常感谢你在这里的灵感。 我能够在不更改任何核心 FB api 文件的情况下完成这项工作。

发生的情况是,setExtendedAccessToken 调用将值发送到 setPersistentData,然后通过 constructSessionVariableName 将其发送到会话中。

因此,如果我们将其从会话中取出,然后将其设置到 facebook 对象中,我们就完成了。

这是我的代码:

// ask for the extended token and get it from session ...
$facebook->setExtendedAccessToken();
$access_token = $_SESSION["fb_".FB_APP_ID."_access_token"];
// now set it into the facebook object ....
$facebook->setAccessToken($access_token);
// now our fb object will use the new token as usual ...
$accessToken = $facebook->getAccessToken();

【讨论】:

  • 你有跨浏览器的版本吗?该会话有时未设置,例如使用 Mac OSX Opera
猜你喜欢
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 2012-08-22
  • 2012-05-15
  • 2012-06-04
  • 2014-02-27
  • 2021-10-03
  • 2014-10-08
相关资源
最近更新 更多