使用Koala续订Facebook访问令牌

时间:2012-01-24 22:13:07

标签: ruby-on-rails-3 koala facebook-javascript-sdk

我在Ruby on Rails应用程序上使用Koala gem

我在通过考拉用于数据的模型上有以下代码:

@graph = Koala::Facebook::GraphAPI.new(token_secret)
friends = @graph.get_connections("me", "friends")

其中token_secret来自我的users表格的字段,保存在登录信息中。

它工作正常,但几分钟后我得到:

Koala::Facebook::APIError (OAuthException: Error validating access token: Session has expired at unix time 1327438800. The current unix time is 1327442037.):

我找到了使用Facebook JS SDK中的方法在前面更新此令牌的方法,但在控制器上调用了我获取好友列表的方法。

如何使用考拉更新token_secret?这有可能吗?

2 个答案:

答案 0 :(得分:20)

我以为我会回答这个问题,因为这是我刚才需要做的事情。

Koala在前一段时间增加了对交换访问令牌的支持,这里: https://github.com/arsduo/koala/pull/166

所以我的用户模型现在具有以下内容:

def refresh_facebook_token
  # Checks the saved expiry time against the current time
  if facebook_token_expired? 

    # Get the new token
    new_token = facebook_oauth.exchange_access_token_info(token_secret)

    # Save the new token and its expiry over the old one
    self.token_secret = new_token['access_token']
    self.token_expiry = new_token['expires']
    save
  end
end

# Connect to Facebook via Koala's oauth
def facebook_oauth
  # Insert your own Facebook client ID and secret here
  @facebook_oauth ||= Koala::Facebook::OAuth.new(client_id, client_secret)
end

答案 1 :(得分:0)

如果您尝试获取Facebook网站应用程序的oauth_token,则需要使用基于重定向的Oauth流程。这有点复杂。对于画布应用程序,它更简单。您仍然可以对画布应用程序使用基于重定向的过程,但最好从signed_request中解析它。

每次用户在Facebook上加载您的应用时,他们都会使用“signed_request”参数登陆您的第一页。必须使用Koala对象在控制器中解析此加密字符串。从结果中,您可以获得一个新的oauth_token,它应该有效约两个小时。这是我如何做到的。

 #Create a new koala Oauth object.
 oauth = Koala::Facebook::OAuth.new(APP_ID, APP_SECRET) 

 #Get the new oauth_token from the signed request.
 your_new_oauth_token = oauth.parse_signed_request(params[:signed_request])["oauth_token"]