2012-10-09 18 views
7

私はRoRアプリケーションを持っています。ここでは、omniauthとgoogle_oauth2を使用してGoogleに対して認証を行い、オフラインアクセスを要求しています。更新トークンを使用してgoogle_oauth2アクセストークンを更新するにはどうすればよいですか?

リフレッシュトークンを使用して現在のアクセストークンを要求するにはどうすればよいですか?また、アクセストークンが機能しなくなったときに、そのアクセストークンを更新するにはどうすればよいですか?もちろん、このような状況では、認証が取り除かれていないと仮定して、ユーザーインターフェースを使用したくないのです。

答えて

5

には、更新トークンを使用して新しいaccess_tokenをフェッチするものは表示されないため、直接交換する必要があるようです。

Google's official OAuth 2.0 documentationはこれを低レベルで行う方法を説明しています。サーバー側のコード内では、このようになります要求を構築するためにあなたの好きなHTTPクライアントを使用します。

CLIENT_IDCLIENT_SECRETあなたは、元の認証に使用すると REFRESH_TOKENがからリフレッシュトークンであるものと同じです
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 

元の認証フロー。交換が成功した場合、あなたは次のようになります応じて新鮮なアクセストークンを受け取ります:

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

あなたがものを必要なときに新しいアクセストークンをつかむために、このプロセスに従うことができます。 expires_inの値を使用して新しい値を必要とするか、APIリクエストが401 HTTPステータスで応答するたびに更新を試みることができます。ルビーHTTPartyの宝石を使用して例えば

9

:@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

これはあなたのレールアプリケーションに実装しますか?たとえば、トークンを送信するhttpartyを使用してユーザーの連絡先を取得するリクエストを取得しました。トークンが期限切れになった場合、更新トークンを投稿する方法は何ですか? – Richlewis

+0

上記のコードは、トークンを更新するPOSTリクエストを行うコードです。 GETリクエストを実行した後、応答コードが401であるかどうかを確認します。これは通常、トークンをリフレッシュする必要があるときに取得するコードです。 HTTPartyのレスポンスコード= 401なら、あなたのニーズに合わせて自分のコードを実行してください。 – Blake

+0

優れている、私の仕事を得て、ありがとう – Richlewis

関連する問題