4

我知道这个关于过期令牌的问题已经被问过很多次了。但是我找不到适合我的情况。基本上我想向用户发出一个 fb apprequest,无论他/她在 Facebook 上是在线还是离线。

另外,我对 Facebook 文档感到困惑。如果有人能回答我下面的问题,非常感谢。

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

  • 假设用户 A 访问令牌已过期。我是否有可能在用户 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

谢谢!

4

5 回答 5

4

我看到了这篇文章,它改编了 Facebook 上 Railscast 的代码,展示了如何将短期令牌换成 60 天的令牌:

用户.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
于 2013-05-23T18:56:43.223 回答
3

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

是的。

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

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

当我对用户进行身份验证时,我是否会获得一个短期令牌,然后我可以根据需要延长有效期,还是默认获得一个长期令牌?

如果您正在执行服务器端身份验证,您将获得一个长期有效的身份验证。在客户端执行此操作,您将获得一个短期令牌,然后您可以将其换成一个长期令牌。

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

于 2012-06-07T06:02:10.553 回答
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
于 2014-01-24T04:51:55.563 回答
0

这也是我必须处理的问题。我正在使用 Devise 从 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

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

于 2012-06-07T04:55:44.830 回答
0

当用户通过 facebook 登录时,它非常简单,只需在您的数据库中更新您的令牌。每次用户登录更新您的数据库时,只需从 HASH 中获取令牌并更新令牌。通过这样做,您可以获得永不过期的令牌。我今天做到了,它也在工作。

于 2014-01-30T12:40:39.940 回答