オフラインアクセスを要求しているomniauthとgoogle_oauth2を使用してGoogleに対して認証しているRoRアプリがあります。
更新トークンを使用して現在のアクセストークンを要求するにはどうすればよいですか?また、アクセストークンが機能しなくなったときに、アクセストークンを更新するにはどうすればよいですか?もちろん、認証が取り消されていないことを前提として、この状況ではユーザーインターフェイスを使用したくありません。
オフラインアクセスを要求しているomniauthとgoogle_oauth2を使用してGoogleに対して認証しているRoRアプリがあります。
更新トークンを使用して現在のアクセストークンを要求するにはどうすればよいですか?また、アクセストークンが機能しなくなったときに、アクセストークンを更新するにはどうすればよいですか?もちろん、認証が取り消されていないことを前提として、この状況ではユーザーインターフェイスを使用したくありません。
Ruby HTTParty gemを使用した例:
ここで、@ 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
google_oauth2
更新トークンを使用して新しいものをフェッチするハンドルには何も表示されないaccess_token
ため、直接交換する必要があるようです。
Googleの公式OAuth2.0ドキュメントでは、これを低レベルで行う方法について説明しています。サーバー側のコード内で、お気に入りの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リクエストが401HTTPステータスで応答するたびに更新を試みることができます。