我有一个RoR应用程序,我在使用omniauth和google_oauth2进行身份验证,并请求离线访问。如何使用我的刷新令牌刷新我的google_oauth2访问令牌?
如何使用我的刷新令牌来请求当前的访问令牌?另外,如何在不再有效时刷新我的访问令牌?我不想在这种情况下有任何用户界面,当然假设授权没有被拿走。
我有一个RoR应用程序,我在使用omniauth和google_oauth2进行身份验证,并请求离线访问。如何使用我的刷新令牌刷新我的google_oauth2访问令牌?
如何使用我的刷新令牌来请求当前的访问令牌?另外,如何在不再有效时刷新我的访问令牌?我不想在这种情况下有任何用户界面,当然假设授权没有被拿走。
我在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_ID
和CLIENT_SECRET
是您用于原始身份验证和REFRESH_TOKEN
相同的人是从刷新令牌原始认证流程。如果交换成功,你会看起来像这样的响应接收新的访问令牌:
{
"access_token":"1/fFBGRNJru1FQd44AzqT3Zg",
"expires_in":3920,
"token_type":"Bearer",
}
您可以按照此过程中抓住新的访问令牌时,你需要一个。您可以使用expires_in
值来估计什么时候需要一个新的值,或者当您的API请求响应401 HTTP状态时尝试刷新。
对于使用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
你会在你的rails应用程序中实现这个吗?例如我有一个获取请求来检索使用发送令牌的httparty的用户联系人,如果令牌已过期,我将如何发布刷新令牌? – Richlewis
我上面发布的代码是执行POST请求刷新令牌的代码。执行GET请求后,我会检查响应代码是否等于401,这通常是您需要刷新令牌时获得的代码。如果HTTParty响应代码== 401然后运行我的代码(根据您的需要进行调整)。 – Blake
非常好,有我的工作,谢谢 – Richlewis