Gem oauth2でトークン期限切れ時に再取得を行う

Gem oauth2で有効期限切れトークンの再取得を試してみました。
2020.08.25

はじめに

仕事柄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で有効期限切れトークンの再取得を試してみました。