Ruby on rails 尝试使用考拉执行fb apprequest,但访问令牌已过期。我该怎么处理?

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不返回画布应用程序的情况下获取新的访问令牌 当我对一个用户进行身份验证时,我是否获得了一个短期的令牌,如果我愿意,我可以扩展

我知道这个过期代币的问题已经被问过很多次了。但我找不到一个适合我的情况。基本上,我想让一个fb apprequest的用户,无论他/她是在线或离线在Facebook上

此外,我对Facebook文档感到困惑。如果有人能回答我下面的问题,我将不胜感激

  • Facebook访问令牌在用户注销Facebook后立即过期,除非它是长期令牌

  • 假设用户的访问令牌已过期。我是否可以在用户a不返回画布应用程序的情况下获取新的访问令牌

  • 当我对一个用户进行身份验证时,我是否获得了一个短期的令牌,如果我愿意,我可以扩展该令牌的有效性,或者默认情况下我是否获得了一个长期的令牌

下面是我使用考拉执行fb请求的代码:

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应用程序请求,因为他们需要以某种方式与我的应用程序交互以生成新的访问令牌?