Ruby on rails 尝试使用考拉执行fb apprequest,但访问令牌已过期。我该怎么处理?
我知道这个过期代币的问题已经被问过很多次了。但我找不到一个适合我的情况。基本上,我想让一个fb apprequest的用户,无论他/她是在线或离线在Facebook上 此外,我对Facebook文档感到困惑。如果有人能回答我下面的问题,我将不胜感激Ruby on rails 尝试使用考拉执行fb apprequest,但访问令牌已过期。我该怎么处理?,ruby-on-rails,facebook,facebook-graph-api,koala,Ruby On Rails,Facebook,Facebook Graph Api,Koala,我知道这个过期代币的问题已经被问过很多次了。但我找不到一个适合我的情况。基本上,我想让一个fb apprequest的用户,无论他/她是在线或离线在Facebook上 此外,我对Facebook文档感到困惑。如果有人能回答我下面的问题,我将不胜感激 Facebook访问令牌在用户注销Facebook后立即过期,除非它是长期令牌 假设用户的访问令牌已过期。我是否可以在用户a不返回画布应用程序的情况下获取新的访问令牌 当我对一个用户进行身份验证时,我是否获得了一个短期的令牌,如果我愿意,我可以扩展
- Facebook访问令牌在用户注销Facebook后立即过期,除非它是长期令牌
- 假设用户的访问令牌已过期。我是否可以在用户a不返回画布应用程序的情况下获取新的访问令牌
- 当我对一个用户进行身份验证时,我是否获得了一个短期的令牌,如果我愿意,我可以扩展该令牌的有效性,或者默认情况下我是否获得了一个长期的令牌
begin
graph = Koala::Facebook::API.new(access_token)
graph.put_object("me", "apprequests", {:message => "..."})
rescue Koala::Facebook::APIError
# Assume a user has a short-lived token and hasn't visit my application for a long time.
# Is it possible to get a NEW long-lived token here without the user going to my application again
# (assume the user did not remove my application) ? If Yes, how to do that using Koala ?
end
谢谢 这也是我必须处理的问题。我正在使用Desive创建Facebook用户之外的用户,以便在身份验证令牌过期时进行身份验证。当令牌过期时,如果不让用户重新授权您的应用程序,则无法续订令牌。所以在我的例子中,我只需要销毁身份验证记录,用户必须重新进行身份验证。营救看起来有点像:
rescue Koala::Facebook::APIError => e
if e.message.include?("OAuthException: Error validating access token:")
Rails.logger.error "Facebook access token not valid for: #{my_model.facebook_authentication} with #{e}"
my_model.facebook_authentication.destroy
else
Rails.logger.error "FacebookApi#perform Koala Error with #{e}, model_id:#{model.id}"
end
end
希望这至少对你有所帮助。有兴趣知道您是否遇到其他解决方案
Facebook访问令牌在用户注销Facebook后立即过期,除非它是长期令牌
对
假设用户的访问令牌已过期。我是否可以在用户a不返回画布应用程序的情况下获取新的访问令牌
用户必须以某种方式与你的应用程序交互,你才能获得新的令牌。这种交互不一定要访问您的实际画布页面,它也可以是在他访问的页面上对FB.getLoginStatus的调用
当我对一个用户进行身份验证时,我是否获得了一个短期的令牌,如果我愿意,我可以扩展该令牌的有效性,或者默认情况下我是否获得了一个长期的令牌
如果您正在进行服务器端身份验证,那么您将得到一个长寿命的身份验证。在客户端进行此操作,您将获得一个短期令牌,您可以将其交换为一个长期令牌
但这里已经清楚地描述了这一点:我遇到了一个改编自的代码,它展示了如何将短期代币兑换为60天的代币:
user.rb
def self.from_omniauth(auth)
# immediately get 60 day auth token
oauth = Koala::Facebook::OAuth.new(ENV["FACEBOOK_APP_ID"], ENV["FACEBOOK_SECRET"])
new_access_info = oauth.exchange_access_token_info auth.credentials.token
new_access_token = new_access_info["access_token"]
new_access_expires_at = DateTime.now + new_access_info["expires"].to_i.seconds
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.image = auth.info.image
user.email = auth.info.email
user.oauth_token = new_access_token #originally auth.credentials.token
user.oauth_expires_at = new_access_expires_at #originally Time.at(auth.credentials.expires_at)
user.save!
end
end
您可以使用以下命令更改rails cast 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
def facebook
如果self.facebook\u在新的_访问_令牌,
:facebook\u expires\u at=>new\u access\u expires\u at)
结束
@facebook | |=考拉::facebook::API.new(self.facebook|u令牌)
块_给定?收益率(@facebook):@facebook
营救考拉::Facebook::APIRROR=>e
logger.info e.to_
无
结束
当用户通过facebook登录时,只需在数据库中更新您的令牌即可。每次用户登录更新数据库时,只需从哈希和更新令牌中获取令牌。通过这样做,您可以拥有永不过期的令牌。我今天就这么做了,它也在工作。谢谢,所以我想不可能向已经过期访问令牌的用户发送fb应用程序请求,因为他们需要以某种方式与我的应用程序交互以生成新的访问令牌?