我尝试使用
$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访问您的网站时,您可以选择延长该访问令牌的过期时间。我们的平台每天只会延长一次过期时间,因此即使用户每天多次修改您的网站,令牌也会在第一次请求时延长。(强调我的(
我相信是这种情况,因为草率的程序员会抓住一切可能的机会打电话给$facebook->setExtendedAccessToken();
,希望总是检索扩展的访问令牌。(而不是首选行为,如果您当前拥有的是短期访问令牌,则只会调用$facebook->setExtendedAccessToken();
- 但是除非您保存了到期日期,否则您如何判断,这本身并不那么可靠......!
我的假设是,如果用户取消对应用的授权,或者令牌以其他方式失效,则限制将重置,并且你将能够在传入短期访问令牌时再次检索扩展访问令牌。但是,这需要进一步测试,因此请对这一段持保留态度。