案例:
FB.init()
初始化它。此调用会创建fbsr_NNNNN
Cookie。 cookie具有会话限制的到期日期(直到浏览器关闭)。在此示例中,我们只调用FB.init()
一次。之后我们调用不包含FB.init()
个调用的页面,因此它没有机会更新access_token /me
/me
请求并查看“必须使用活动访问令牌来查询有关当前用户的信息。”这是因为当前的php sdk实现:
public function getSignedRequest() {
if (!$this->signedRequest) {
if (isset($_REQUEST['signed_request'])) {
$this->signedRequest = $this->parseSignedRequest(
$_REQUEST['signed_request']);
} else if (isset($_COOKIE[$this->getSignedRequestCookieName()])) {
$this->signedRequest = $this->parseSignedRequest(
$_COOKIE[$this->getSignedRequestCookieName()]);
}
}
return $this->signedRequest;
}
只是按原样从access_token
获取,如果是异常,则不会清除它。因此,如果不删除手动cookie,代码就无法返回正常的工作流程。是的,如果我删除了cookie - 代码再次开始工作(只要没有保存的access_token和库就会获取新的实际代码)。
那么你会提出这个问题的解决方法吗?你用什么?你认为这是一个错误吗?
UPD :似乎有可能的解决方法:扩展Facebook
类并覆盖清除持久存储的方法。有关详细信息,请查看对答案http://facebook.stackoverflow.com/a/8294559/251311
但我个人仍然确定FB SDK应该在没有任何额外黑客的情况下处理它
答案 0 :(得分:1)
第一:我没有Facebook本身的经验,但OAuth 2 RFC指定refresh_token
- 考虑实施它。
第二:Facebook返回错误,对吧?如果发生该错误,则只需取消设置cookie。如果这对您当前的实现不起作用,那么您做错了 - 我见过的每个Twitter库(也使用OAuth,尽管是1.0a)都使用自己的HTTP包装器。而不是回复请求您的URL,而只是自己执行请求。
第三:如果你只是在cookie上设置超时怎么办?我相当确定OAuth还会给你一个expires_in
值,只需使用它(由于网络滞后等,这个值需要5秒钟。)