この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
仕事柄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で有効期限切れトークンの再取得を試してみました。