我尝试使用
扩展长期访问令牌$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()的目的是什么,因为它没有返回任何内容?
答案 0 :(得分:12)
@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();
答案 1 :(得分:5)
在进一步尝试捅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以检索访问令牌(例如,在页面刷新之后)将返回相同的旧的短命访问令牌。 *捂脸*
setExtendedAccessToken();
也会返回您之前检索到的相同扩展访问令牌。此令牌仍可用于查询用户信息。所以,这看起来像Facebook的bug,就像我讨厌说的那样。我们可以通过上面详述的hack解决它,并且任何后续的获取访问令牌的调用都将返回一个短暂的访问令牌,可以一次又一次地交换相同的扩展访问令牌。
原始答案
根据this answer,新的访问令牌保存在持久数据中(正如您在问题中所述),可以通过$facebook->getAccessToken();
访问。
两个相关说明:
$facebook->getAccessToken();
时,你只是回到同一个令牌,但它的到期时间已经改变了?来自Facebook文档:
当用户使用现有的,有效的,短期用户access_token访问您的站点时,您可以选择延长该访问令牌的到期时间。 我们的平台只会延长每天一次的到期时间,因此即使用户每天多次撤销您的网站,该令牌也会在首次请求时延长。 (强调我的)
我相信情况就是这样,因为草率的程序员会在每次可能的机会都会调用$facebook->setExtendedAccessToken();
,希望始终检索扩展的访问令牌。 (而不是首选行为,如果您当前拥有的是短暂的访问令牌,则只会调用$facebook->setExtendedAccessToken();
,但除非您保存了到期日,其本身并不可靠......!)
我的假设是,如果用户取消授权应用程序,或者令牌无效,则限制将重置,并且您可以在传入短期访问令牌时再次检索扩展访问令牌。但是,这需要进一步测试,所以请把这一段带上一粒盐。