刷新用户facebook令牌

时间:2016-05-03 18:45:46

标签: ruby facebook facebook-access-token koala koala-gem

我在rails中有一个应用程序,它基于facebook oauth2。一目了然 - 用户使用FB connect登录并可以列出它的页面(并用这些数据做一些事情,但现在这并不重要。让我们只关注登录和获取页面列表。)

登录后,我将用户access_tokenexpires_at保存在数据库中。然后,每当我需要向facebook api作为用户请求(获取他的页面列表)时,我正在检查expires_at是否未过去,如果是,我正在使用以下代码片段续订用户令牌:< / p>

  def refresh_facebook_token
    # Checks the saved expiry time against the current time
    return unless facebook_token_expired?

    # Get the new token
    new_token = facebook_oauth.exchange_access_token_info(
      old_access_token)

    # Save the new token and its expiry over the old one
    self.facebook_auth = {
      uid:          uid,
      access_token: new_token['access_token'],
      expires_at:   Time.now + new_token['expires'].to_i
    }
    save
  end

大部分时间都可以使用,但有时我的代码会抛出:

  

类型:OAuthException,代码:190,error_subcode:460,message:验证访问令牌时出错:会话与当前存储的会话不匹配。这可能是因为用户在创建会话之后更改了密码,或者Facebook出于安全原因更改了会话。 [HTTP 400]

符合exchange_access_token_info

该错误是由我自己的用户引发的,我可以说我没有更改密码所以我不确定是什么原因造成的,也不知道如何以防弹的方式处理后端刷新令牌

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

首先,我建议您浏览this link并确定哪种配置对您的应用程序有意义 - 使用短命或长寿或什么。

现在,我不太确定,但我认为您正在考虑将方法exchange_access_token_info作为令牌复习。如果是这样,情况并非如此!一旦令牌过期,它就没用了。  exchange_access_token_info方法只需使用短期令牌(当前处于活动状态)并使用app id和secret将其转换为长期令牌。

请理解 -

  

用户访问令牌无法无限延长,无需用户与您的应用互动60天。

所以流程非常简单 -

  • 当用户验证您的应用(前端的用户互动)时,您会获得短期令牌
  • 在服务器端,您将令牌的有效期延长至60天。
  • 想再次延长令牌有效期吗? - 重复这些步骤。

希望有所帮助!