Auth0では、Authorization Code Grantでのリフレッシュトークン発行が下記の仕様となっている。
- リフレッシュトークンを発行するにはAuthorization Requestの
scope
パラメータにoffline_access
を指定する必要がある。 - 発行されるリフレッシュトークンはログインセッションに紐づかないものとなり、ログインセッションが無効となっても、リフレッシュトークンは有効なままとなる。
ここで、draft-ietf-oauth-browser-based-apps-19に記載される、Single Page ApplicationでRefresh Token Rotationを有効化してリフレッシュトークンを利用するパターンについて考える。このパターンでは offline_access
である必要はなく、ログインセッションに同期してリフレッシュトークンを無効化できるとセキュリティ上都合がよい。
Auth0では長らくこの振る舞いの実現ができなかったが、直近のアップデートでワークアラウンドではあるが対応できるようになっている。
対応方法
-
ApplicationにBack-channel Logoutを設定し、Back-channel Logout Requestで通知される無効となったセッションIDをDB等に保存しておく。
-
post-login Actionにて、Refresh Token Requestを処理するタイミングでリフレッシュトークンに紐づくセッションIDがDBに登録されていないかを確認する。登録されている場合にはRefresh Tokenを無効化する。
-
サンプルコード
exports.onExecutePostLogin = async (event, api) => { if (event.transaction?.protocol === 'oauth2-refresh-token') { // Calls an API to check if the session_id is listed in the DB. if(isExpiredSession(event.refresh_token?.session_id)) { api.refreshToken?.revoke("login session expired."); } } };
-
補足情報
-
振る舞いを検証する際、以下のシェルスクリプトでリフレッシュトークンの発行と利用ができる。
-
Authorization Request
BASE_URI=https://xxx.jp.auth0.com CLIENT_ID=xxx REDIRECT_URI=http://localhost # OSによってコマンドを置き換えること (openコマンドなど) wsl-open "${BASE_URI}/authorize?response_type=code&client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&scope=openid+offline_access&state=abcd1234"
-
Token Request (Authorization Code)
BASE_URI=https://xxx.jp.auth0.com CLIENT_ID=xxx CLIENT_SECRET=xxx REDIRECT_URI=http://localhost CODE=xxx curl -s -X POST \ "${BASE_URI}/oauth/token" \ -d "grant_type=authorization_code" \ -d "client_id=${CLIENT_ID}" \ -d "client_secret=${CLIENT_SECRET}" \ -d "redirect_uri=${REDIRECT_URI}" \ -d "code=${CODE}"
-
Token Request (Refresh Token)
BASE_URI=https://xxx.auth0.com CLIENT_ID=xxx CLIENT_SECRET=xxx REFRESH_TOKEN=xxx curl -s -D- -X POST \ "${BASE_URI}/oauth/token" \ -d "grant_type=refresh_token" \ -d "client_id=${CLIENT_ID}" \ -d "client_secret=${CLIENT_SECRET}" \ -d "refresh_token=${REFRESH_TOKEN}"
-
-
外部のシステムからリフレッシュトークンを無効化したい場合以下の2つの方法が提供されている。
- Authentication API (
/oauth/revoke
) - Management API (
/api/v2/device-credentials
) - 参考:Revoke Refresh Tokens
- Authentication API (