oauth2 を使った処理でOAuth2::Error
というふんわりしたエラーが発生したから何かと思ったら、アクセストークンの期限が切れてた。
READMEにはrefresh_token関連の記述はなさそうだったけど、メソッドは用意されている模様。
https://github.com/intridea/oauth2/blob/0ab3c213f7baa43f232eb18fa46301e1a9460f7d/lib/oauth2/access_token.rb#L80
こんな感じで更新できた。
(credentialsはomniauthのrequest.env['omniauth.auth'].credentials
を想定。)
def initialize(credentials)
self.client = OAuth2::Client.new(
Settings.example.client_id,
Settings.example.client_secret,
site: Settings.example.site,
ssl: { verify: false }
)
self.access_token = OAuth2::AccessToken.new(
client,
credentials.token,
refresh_token: credentials.refresh_token, # 追加
expires_at: credentials.expires_at # 有効期限の判定のためこれも必要
)
# トークンの有効期限が切れていたら更新する
self.access_token = access_token.refresh! if self.access_token.expired?
access_token
end
注意:access_tokenをDBとかに保存している場合は、更新した後のトークンを保存しておくこと。