Gem oauth2でトークン期限切れ時に再取得を行う
Gem oauth2で有効期限切れトークンの再取得を試してみました。
はじめに
仕事柄OAuth2でトークン発行を行わない日はない、特にClient Credentials Grant でトークン発行するコードを無駄に再生産 息をするように書いているわけですが、毎度書くのがしんどくなってきたのでruby gem のoauth2を試してみました。
やったこと
手始めに以下の2つを試してみました。
- oauth2を使ってClient Credentials Grantでアクセストークンを発行する
- トークンの期限切れの際にはトークンを再取得してリクエストをリトライする
使ったRuby/Gemのバージョン下記の通りです。
- ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin18]
- oauth2 (1.4.4)
コード例
早速ですが以下のようになります(こうして例にしてみるとなんてことないのですが、GitHubのWiki以上のドキュメントが見当たらなくrdocとコードを読むしかなかったので少し試行錯誤が必要でした)
コードにもあるようにトークンが期限切れの場合にはリソースへのアクセスのレスポンスのステータスコードを確認して明示的にトークンの再発行をする必要があります。
この例ではClient#get_tokenを使っていますがリフレッシュトークンが利用可能な場合はOAuth2::AccessToken#refresh!
で再取得ができるようです。
require 'oauth2' CLIENT_ID = ENV['CLIENT_ID'] CLIENT_SECRET = ENV['CLIENT_SECRET'] AUTH_SERVER = ENV['AUTH_SERVER'] # 認可サーバ RESOURCE_URL = ENV['RESOURCE_URL'] # リソースサーバ上のリソースURL client = OAuth2::Client.new( CLIENT_ID, CLIENT_SECRET, :site => AUTH_SERVER ) token = client.client_credentials.get_token # トークンが有効か確認 token.get(RESOURCE_URL, raise_errors: true) # ...長い時間が経ってトークンが期限切れする # sleep token.expires_in begin token.get(RESOURCE_URL) rescue OAuth2::Error => e # ステータスコードで期限切れの場合か判定する if e.response.status == 401 token = client.client_credentials.get_token retry else raise end end
まとめ
Gem oauth2で有効期限切れトークンの再取得を試してみました。