0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Auth0でリフレッシュトークンをセッションに同期させる方法

Posted at

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.");
          }
        }
      };
      

      参考:Refresh Tokens with Actions

補足情報

  • 振る舞いを検証する際、以下のシェルスクリプトでリフレッシュトークンの発行と利用ができる。

    • 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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?