2012-10-09 147 views
7

我有一个RoR应用程序,我在使用omniauth和google_oauth2进行身份验证,并请求离线访问。如何使用我的刷新令牌刷新我的google_oauth2访问令牌?

如何使用我的刷新令牌来请求当前的访问令牌?另外,如何在不再有效时刷新我的访问令牌?我不想在这种情况下有任何用户界面,当然假设授权没有被拿走。

回答

5

我在google_oauth2中看不到任何东西,它会处理使用刷新标记获取新的access_token,所以看起来您需要直接进行交换。

Google's official OAuth 2.0 documentation解释了如何在较低的水平上做到这一点。在你的服务器端代码,用你喜欢的HTTP客户构建一个看起来像这样的请求:

POST /o/oauth2/token HTTP/1.1 
Host: accounts.google.com 
Content-Type: application/x-www-form-urlencoded 

client_id=CLIENT_ID& 
client_secret=CLIENT_SECRET& 
refresh_token=REFRESH_TOKEN& 
grant_type=refresh_token 

其中CLIENT_IDCLIENT_SECRET是您用于原始身份验证和REFRESH_TOKEN相同的人是从刷新令牌原始认证流程。如果交换成功,你会看起来像这样的响应接收新的访问令牌:

{ 
    "access_token":"1/fFBGRNJru1FQd44AzqT3Zg", 
    "expires_in":3920, 
    "token_type":"Bearer", 
} 

您可以按照此过程中抓住新的访问令牌时,你需要一个。您可以使用expires_in值来估计什么时候需要一个新的值,或者当您的API请求响应401 HTTP状态时尝试刷新。

9

对于使用Ruby HTTParty宝石为例:

哪里@auth是存储特定用户的身份验证密钥您尝试刷新令牌一个ActiveRecord记录。

# Refresh auth token from google_oauth2 and then requeue the job. 
    options = { 
    body: { 
     client_id: <YOUR GOOGLE API CLIENT ID HERE>, 
     client_secret: <YOUR GOOGLE API SECRET KEY HERE>, 
     refresh_token: @auth.refresh_token, 
     grant_type: 'refresh_token' 
    }, 
    headers: { 
     'Content-Type' => 'application/x-www-form-urlencoded' 
    } 
    } 
    @response = HTTParty.post('https://accounts.google.com/o/oauth2/token', options) 
    if @response.code == 200 
    @auth.token = @response.parsed_response['access_token'] 
    @auth.expires_in = DateTime.now + @response.parsed_response['expires_in'].seconds 
    @auth.save   
    else 
    Rails.logger.error("Unable to refresh google_oauth2 authentication token.") 
    Rails.logger.error("Refresh token response body: #{@response.body}") 
    end 
+0

你会在你的rails应用程序中实现这个吗?例如我有一个获取请求来检索使用发送令牌的httparty的用户联系人,如果令牌已过期,我将如何发布刷新令牌? – Richlewis

+0

我上面发布的代码是执行POST请求刷新令牌的代码。执行GET请求后,我会检查响应代码是否等于401,这通常是您需要刷新令牌时获得的代码。如果HTTParty响应代码== 401然后运行我的代码(根据您的需要进行调整)。 – Blake

+0

非常好,有我的工作,谢谢 – Richlewis