尝试使用Koala进行fb apprequest,但访问令牌已过期。我应该怎么处理?

时间:2012-06-07 02:32:29

标签: ruby-on-rails facebook facebook-graph-api koala

我知道这个过期令牌的问题已被多次询问过。但我找不到适合我情况的那个。基本上我想向用户提出fb apprequest,无论他/她是否在Facebook上线或离线。

另外,我对Facebook文档感到困惑。如果有人能回答我在下面提出的问题,那就太感激了。

  • Facebook访问令牌会在用户退出Facebook后立即过期,除非它是一个长期存在的令牌?

  • 说用户访问令牌已过期。在没有用户A返回我的画布应用程序的情况下,我是否可以获得新的访问令牌?

  • 当我对用户进行身份验证时,我是否会获得一个短期令牌,如果我愿意,我可以延长有效期,或者我是否默认获得长期令牌?

下面是我用来使用Koala执行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

谢谢!

5 个答案:

答案 0 :(得分:4)

我遇到this post来调整Railscast on Facebook中的代码,以显示如何为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

答案 1 :(得分:3)

  

Facebook访问令牌会在用户退出Facebook后立即过期,除非它是一个长期存在的令牌?

  

说用户访问令牌已过期。我是否有可能在没有用户A回到我的画布应用程序的情况下获得新的访问令牌?

用户必须以某种方式与您的应用互动才能获得新令牌。该交互不必访问您的实际画布页面,它可以f.e.也是在他正在访问的页面上调用FB.getLoginStatus。

  

当我对用户进行身份验证时,我是否会获得一个短期令牌,然后我可以扩展有效性,如果我想要或者我是否默认获得长期令牌?

如果您正在进行服务器端身份验证,那么您将获得一个长期存在的身份验证。在客户端进行操作时,您将获得一个短期令牌,您可以用它来换取长期存在的令牌。

但这一切都在这里清楚地描述:https://developers.facebook.com/roadmap/offline-access-removal/

答案 2 :(得分:2)

您可以使用以下命令更改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

答案 3 :(得分:0)

这也是我必须处理的问题。我正在使用Devise来创建Facebook用户的用户,以便在身份验证令牌过期时进行身份验证。当令牌过期时,如果没有让用户重新授权您的应用,则无法续订令牌。所以在我的情况下,我只需要破坏认证记录,用户必须reauth。救援看起来像是:

  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

希望这至少可以帮助你。有兴趣知道您是否遇到其他解决方案。

答案 4 :(得分:0)

当用户通过Facebook登录时,只需在数据库中更新您的令牌即可。每次用户签名登录更新您的数据库,只需从HASH获取令牌并更新令牌。通过这样做,您可以拥有永不过期的令牌。我今天做了它,它也在工作。