我有一个应用程序,用户可以链接他们的Facebook帐户。他们可以使用他们的电子邮件登录,但他们可以链接他们的Facebook帐户。
在我展示链接社交网络(Facebook和其他人)的视图中,我有类似这样的内容:
<%= image_tag @facebook.get_facebook_picture %>
这将调用这样的实例方法:
def get_facebook_picture
unless self.token.nil?
facebook_graph = Koala::Facebook::GraphAPI.new(self.token)
fb_picture = facebook_graph.get_picture("me", { :type => "small" })
end
end
除非我存储在我的数据库中的Facebook令牌已过期,否则这将很有效。所以我在上面提到的控制器中添加了这个异常处理程序:
def facebook_exception_handler exception
if exception.fb_error_type.eql? 'OAuthException'
# Let's get a new auth token... How?
else
logger.debug "Damn it. We don't know what error is coming from FB"
raise exception
end
end
我正确捕获了异常,但是我没有看到如何更新我在数据库中的访问令牌。请注意,我使用OmniAuth插入了我的访问令牌。所以我的问题是:
鉴于我有OAuthException
,如何使用 Omniauth 续订特定用户(UID)的访问令牌?
答案 0 :(得分:9)
简单的情况是您使用FB重新授权用户,就像您首先授权用户一样。为了获得令牌,我假设您正在使用omniauth(和onmiauth-facebook)对FB进行身份验证。这意味着你有一个路由和一个控制器动作来处理auth回调,以及一个将令牌插入数据库的函数。
您最初使用omniauth获取的访问令牌可能因各种原因而失效 - 到期,或者因为用户更改了他们的FB密码,可能还有其他人。在这些情况下,另一个OAuth调用将返回有效令牌。只需再次呼叫(就像您第一次授权用户时所做的那样)并在数据库中用新的令牌替换无效令牌,并且您很好。
This gist(my own answer我在这里提到的一个相关问题)有一些代码涵盖了这一点,但听起来你已经覆盖了这个。保存足够的状态然后重新尝试触发异常的任何事情并且你很好。
此令牌现在也可能无效,因为用户已更改其FB应用设置以取消授权您的应用。在这种情况下,用户将看到FB权限对话框,就好像他们是第一次对FB进行身份验证的新用户一样。 (FB)
这有意义吗?
答案 1 :(得分:2)
您可以使用以下命令更改RailsCasts koala教程连接:
def facebook
if self.facebook_expires_at < Time.now
oauth = Koala::Facebook::OAuth.new(ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"])
new_access_info = oauth.exchange_access_token_info self.facebook_token
new_access_token = new_access_info["access_token"]
new_access_expires_at = DateTime.now + new_access_info["expires"].to_i.seconds
self.update_attributes!(:facebook_token => new_access_token,
:facebook_expires_at => new_access_expires_at )
end
@facebook ||= Koala::Facebook::API.new(self.facebook_token)
block_given? ? yield(@facebook) : @facebook
rescue Koala::Facebook::APIError => e
logger.info e.to_s
nil
end