如何处理过期的access_token

时间:2011-11-28 10:30:33

标签: facebook oauth

案例:

  1. 我们插入FB JS并使用FB.init()初始化它。此调用会创建fbsr_NNNNN Cookie。 cookie具有会话限制的到期日期(直到浏览器关闭)。在此示例中,我们只调用FB.init()一次。之后我们调用不包含FB.init()个调用的页面,因此它没有机会更新access_token
  2. 我们执行身份验证并进行一些服务器端(PHP FB SDK)调用,如/me
  3. 等待30分钟或其他什么,直到FB会话到期
  4. 再次执行/me请求并查看“必须使用活动访问令牌来查询有关当前用户的信息。”
  5. 这是因为当前的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应该在没有任何额外黑客的情况下处理它

1 个答案:

答案 0 :(得分:1)

第一:我没有Facebook本身的经验,但OAuth 2 RFC指定refresh_token - 考虑实施它。

第二:Facebook返回错误,对吧?如果发生该错误,则只需取消设置cookie。如果这对您当前的实现不起作用,那么您做错了 - 我见过的每个Twitter库(也使用OAuth,尽管是1.0a)都使用自己的HTTP包装器。而不是回复请求您的URL,而只是自己执行请求。

第三:如果你只是在cookie上设置超时怎么办?我相当确定OAuth还会给你一个expires_in值,只需使用它(由于网络滞后等,这个值需要5秒钟。)