获得长期的访问令牌与setExtendedAccessToken()返回短命令牌(Getting l

2019-06-27 13:54发布

我试图让与扩展长期访问令牌

$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()的目的,因为它不返回任何东西?

Answer 1:

@Julian。 非常感谢你对这里的灵感。 我是能够使这项工作不改变任何核心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();


Answer 2:

经过进一步尝试拨开周围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的错误,就像我讨厌这样说。 我们可以得到它周围与我上面已经详细介绍了黑客,任何后续调用来获取访问令牌只返回一个短暂的访问令牌,它可以一次又一次相同的扩展访问令牌交换。


原来的答案

根据这个答案 ,新的访问令牌被保存在持久性数据(如你还在你的问题所示),并且可以通过访问$facebook->getAccessToken();

两个相关的注意事项:

  • 该页面还提到,当短暂的访问令牌用于扩展的访问令牌交换,令牌本身可能会或可能不会改变 ,虽然到期时间应该已经更新,以反映较长到期。 也许,当你调用$facebook->getAccessToken(); ,你只是得到同样的道理回来了,但其到期发生了变化?
  • 呼叫交换一个短暂的访问令牌用于扩展一个只能使用一次,每个用户每天发。 我不知道这是为什么,我不知道这是否计数器复位,如果用户决定取消授权您的应用程序,并重新检查。

从Facebook的文档:

当用户与现有的,有效的,短命的用户访问的access_token你的网站,你必须扩展该访问令牌的到期时间的选项。 我们的平台将只能每天一次延长到期时间 ,因此即使用户revists您的网站在一天内多次,令牌将被要求延长第一次。 (重点煤矿)

我相信这个情况是因为草率的程序员会调用$facebook->setExtendedAccessToken(); 在每一个可能的机会,在总检索扩展的访问令牌的希望。 (取而代之的是首选的行为,这将是唯一呼吁$facebook->setExtendedAccessToken();如果你目前所拥有的是一个短暂的访问令牌-但如何将你甚至告诉,除非你已经保存的有效期,这本身并没有可靠的......!)

我的假设是,如果用户取消授权的应用程序,或者令牌,否则无效,限制将重置,你将能够通过在一个短暂的访问令牌时,再次检索扩展的访问令牌。 然而,这需要进一步的测试,所以请把本段一粒盐。



文章来源: Getting long-lived access token with setExtendedAccessToken() returns short lived token