doorkeeper で リフレッシュトークンの仕組みを使う

こんにちは。バナナを食べています、きたけーです。

doorkeeper で Resource Owner Password Credentials flow を試してみた - きたけーTechブログ の続きで、アクセストークンの有効期限の設定+リフレッシュトークンの仕組みをつかってみたのでメモ。

アクセストークンの有効期限

悪意のある何者かにアクセストークンが漏洩した場合を考えて、アクセストークンに有効期限を設定しておくことで悪意のある操作が可能な期間を限定することができる。

リフレッシュトークンの仕組み

有効期限が切れるときに再びアクセストークンを発行するためにユーザーにログインさせるのもアレなので、リフレッシュトークンという仕組みが用意されている。

最初にアクセストークンを取得するときに、同時に発行されるリフレッシュトークンを保持しておいて、期限が切れる(切れた)タイミングで、そのリフレッシュトークンを使うことで新しいアクセストークンが取得できる。

(通信に必ず含まれるアクセストークンと比較して、必要になるまで手元に保持しておけばいいリフレッシュトークンは漏洩する可能性が低いという前提があるのだけど、スマホのアプリとかブラウザで保持している限り安全ではない。だから、有効期限+リフレッシュトークンの仕組みは完璧とはいえない。ちょっとましな程度)

doorkeeperでの設定

リフレッシュトークンの仕組みをつかう、アクセストークンの有効期限の設定をおこなうには config/initializers/doorkeeper.rbに以下の内容を書く

use_refresh_token
access_token_expires_in 5.minutes

リフレッシュトークンを使ってアクセストークンを発行する

oauth2 gemの場合はこんなかんじ

require 'oauth2'

client = OAuth2::Client.new('CLIENT ID', 'CLIENT SECRET', site: 'http://localhost:3000') # CLIENT ID と CLIENT SECRET は Resource Owner Password Credentials では不要
access_token = client.password.get_token('kitak@example.com', 'PASSWORD') # 初回の発行

access_token = access_token.refresh! # リフレッシュトークンから再発行

中では、以下のようなパラメータでHTTP POSTしている(仕様は RFC 6749 - The OAuth 2.0 Authorization Framework を参照)。

grant_type=refresh_token&refresh_token=XXXXXXXXXXXXX