我在rails中有一个应用程序,它基于facebook oauth2。一目了然 - 用户使用FB connect登录并可以列出它的页面(并用这些数据做一些事情,但现在这并不重要。让我们只关注登录和获取页面列表。)
登录后,我将用户access_token
和expires_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
。
该错误是由我自己的用户引发的,我可以说我没有更改密码所以我不确定是什么原因造成的,也不知道如何以防弹的方式处理后端刷新令牌
非常感谢任何帮助!
答案 0 :(得分:1)
首先,我建议您浏览this link并确定哪种配置对您的应用程序有意义 - 使用短命或长寿或什么。
现在,我不太确定,但我认为您正在考虑将方法exchange_access_token_info
作为令牌复习。如果是这样,情况并非如此!一旦令牌过期,它就没用了。
exchange_access_token_info
方法只需使用短期令牌(当前处于活动状态)并使用app id和secret将其转换为长期令牌。
请理解 -
用户访问令牌无法无限延长,无需用户与您的应用互动60天。
所以流程非常简单 -
希望有所帮助!