尝试两次使用同一令牌时,Oauth令牌无效?

时间:2011-02-04 01:49:36

标签: ruby-on-rails ruby-on-rails-3 oauth

嘿伙计们我正在尝试使用Dailybooth api,并通过oauth访问用户..我是ruby / rails的新手,这是我第一次使用api和oauth。这是事情

if params[:code] #if the code is avaible, use the code
  dailybooth.oauth_token(params[:code])
  @oauth_token_ = params[:code]
  session[:oauth_code] = @oauth_token_
else #else, attempt to  use the session
  if session[:oauth_code]  #If session is set
    dailybooth.oauth_token(session[:oauth_code]) #sign in using session
  else #else, check if the params[:code] is set and use, or redirect to dailybooth authorize
    if params[:code]
      dailybooth.oauth_token(params[:code])
      @oauth_token_ = params[:code]
      session[:oauth_code] = @oauth_token_
    else
     #first redirect the user to the authorize_url
     redirect_to dailybooth.authorize_url
    end
  end
end
#make request to the api
@info = dailybooth.get('/users.json')

if @info['error']      
  if @info['error']['error_code'] 
    if @info['error']['error_code'] == 302 #if getting invalid token, request another token.
      session[:oauth_code] = nil
      @info = "Getting Errorcode 302, invalid token."
      #first redirect the user to the authorize_url
      # redirect_to dailybooth.authorize_url
    end
  end
end

所以,这是我的应用程序的索引。当我第一次进入索引时,我立即转发到dailybooth来授权我的帐户,在授权后,dailybooth将我返回到我的网站,其网址看起来像“http://site.com/?code=XXX”并且“dailybooth.get('/ users.json')”开始工作,它实际上是用户信息。但如果我尝试刷新,转到相同的“http://site.com/?code=XXX”,它会说令牌无效。这是为什么?令牌只是有效的,现在它不起作用。有什么建议?这是我的错误吗?

2 个答案:

答案 0 :(得分:1)

我的猜测是问题是你存储的是每日的OAuth令牌,而不是存储访问令牌。您对dailybooth.oauth_token(...)的调用可能会生成一个访问令牌,您应该存储它,而不是params [:code](OAuth令牌)。通常OAuth的工作方式如下:

  1. 将用户重定向到该站点以授予您的应用程序访问权限。
  2. 通过OAuth令牌将用户重定向回您的网站,您可以访问API或外部网站的某些部分。
  3. 您可以将OAuth令牌换成可用于访问API和网站的访问令牌。
  4. 一旦OAuth令牌换成了访问令牌,就无法再次使用,但访问令牌可以。
  5. 检查dailybooth对象,你可能会以某种方式访问​​实际的访问令牌(dailybooth.token或dailybooth.access_token可能?)。确保将该访问令牌存储在会话或数据库中,然后在返回页面时使用该访问令牌,而不是此时变为无效的参数[:code]。

答案 1 :(得分:0)

我无法帮助您使用Ruby,因为我从未使用它,但是我可以在上面的注释中添加OAuth 2中的流程(这绝对是首选的选择):

  1. 用户访问您的网站,需要访问需要使用第三方OAuth提供商API的功能(您的网站是消费者,第三方是提供商,我将在下面通过这种方式调用)
  2. 消费者向提供商发出内部HTTPS请求以获取未经授权的请求令牌。
  3. 消费者使用在步骤2中收到的请求令牌将用户重定向到提供商,以便该令牌由提供商站点的用户授权。
  4. 在用户授权Request令牌(最终)之后,Provider会创建 Verifier String ,并使用此Verifier字符串和Request Token将用户重定向回回调,这非常重要。实际上,这是OAuth 2的一部分,它标识用户确实授权了令牌(Verifier字符串)。
  5. Consumer使用Request令牌和 Verifier String 发出内部HTTPS请求以获取授权访问令牌。
  6. 此时,如果消费者收到访问令牌,他有权在用户允许的情况下访问受保护的API。
  7. 以下是对Verifier重要性并添加到协议中的原因的一个很好的解释:

    http://hueniverse.com/2009/04/explaining-the-oauth-session-fixation-attack/