我试图让与扩展长期访问令牌
$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()的目的,因为它不返回任何东西?
@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();
经过进一步尝试拨开周围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