メインコンテンツへスキップ

始める前に

バックチャネルログアウトを使用するには、アプリケーションが以下の要件を満たす必要があります。
  • Auth0テナントがアクセスできるように、OIDCバックチャネルログアウトのURIエンドポイントがインターネット上で公開されている必要があります。
  • 本番環境の準備が整ったアプリケーションはTLSを使用する必要があります。詳細については、「TLS(SSL)のバージョンと暗号」をお読みください。
  • アプリケーションは提供されたセッション識別子(sid)を保管し、作成するユーザーセッションとその識別子を関連付けられなくてはなりません。本番環境のアプリケーションにはセッションで持続性ストレージの使用を推奨します。
  • アプリケーションは、クライアント側のクッキーを使うことなく、ログアウトプロセス中にsidを使って既存のセッションを取得できなくてはなりません。クッキーはブラウザー内に存在しており、ログアウトコールバックのエンドポイントにはアクセスできません。

利用

OIDCバックチャネルログアウトは、すべてのエンタープライズプランのお客様が利用するためのものです。アプリケーションが要件を満たしているかを確認するには、OIDC標準の/.well-known/*メタデータエンドポイントを確認する必要があります。
GET https://acme.eu.auth0.com/.well-known/openid-configuration

HTTP 200
{ ..., "backchannel_logout_supported": true, 
  "backchannel_logout_session_supported": true }

バックチャネルログアウトでの制約

バックチャネルログアウトURLは公開されたエンドポイントで呼び出され、特定の制約を守らなければなりません。
  1. HTTPSプロトコルを使用する必要があります。暗号化されていない HTTPや他のプロトコルは許可されません。
  2. Auth0のサブドメインを使用してはいけません。Auth0のサブドメインには以下が挙げられます。
    • auth0.com
    • auth0app.com
    • webtask.io
    • webtask.run
  3. ドメインのないIPアドレスの使用は推奨されません。バックチャネルログアウトを使用するには、IPアドレスが公開IPでなければなりません。範囲が内部、予約済み、またはループバックのIPアドレスは許可されていません。

Auth0を構成する

またはを使用してログアウトトークンを取得するには、アプリケーションを登録します。
  • Auth0 Dashboard
  • Management API

アプリケーションの登録

  1. [Auth0 Dashboard] > [Applications(アプリケーション)] に移動します。
  2. 登録したいアプリケーションを選択します。
  3. [Settings(設定)] タブを選択します。
  4. [OpenID Connect Back-Channel Logout(Open ID Connectバックチャネルログアウト)] > [Back-Channel Logout URI(バックチャネルログアウトURl)] の下に、logout_tokensを受け取るアプリケーションのログアウトURIを追加します。
  5. 完了したら、 [Save Changes(変更を保存)] を選択します。
    Auth0 Dashboard > Applications > Settings

アプリケーションの登録解除

アプリケーションの登録を解除すると、新しいログインのトラッキングやログアウトイベントの送信といったサービスが停止します。アプリケーションの登録が解除されると、ログアウトイベントのペンディングが破棄されます。アプリケーションのサブスクライブを解除するには、バックチャネルのログアウトURLを削除します。
  1. [Auth0 Dashboard] > [Applications(アプリケーション)]に移動します。
  2. 登録したいアプリケーションを選択します。
  3. [Settings(設定)] タブを選択します。
  4. [OpenID Connect Back-Channel Logout(OpenID Connectバックチャネルログアウト)] > [Back-Channel Logout URI(バックチャネルログアウトURI)] の下
  5. バックチャネルURLを削除する
  6. 完了したら、 [Save Changes(変更を保存)] を選択します。
    Auth0 Dashboard > Applications > Settings
監査の目的で、Auth0のテナントログで、バックチャネルログアウトURLのサブスクライブや、その解除をAPI Operation Eventとして常にロギングしています。詳細については、「ログ」をお読みください。

アプリケーションを構成する

Auth0 DashboardまたはManagement APIを使用してバックチャネルログアウトを構成したら、技術やフレームワークに基づいて、アプリケーションがサービスを使用できるように構成します。
  1. アプリケーションの種類に応じてエンドユーザーの認証を実装します。
    1. エンドユーザーがアプリケーションにログイン可能で、セッションが作成されなければなりません。
    2. IDトークンがAuth0から発行され、アプリケーションのバックエンドで処理するためにアクセスできなければなりません。
  2. IDトークンが検証された後、ログインプロセスを拡張してsidクレームと、任意でsubクレームを保存します。
    1. これらのクレームは、現在のアプリケーションセッションに対して保存されなければなりません。
    2. セッション管理機能は、sid値によって特定のセッションを取得できる必要があります。
  3. バックチャネルログアウトのエンドポイントを構成します。
    1. エンドポイントはHTTP POST要求のみを処理する必要があります。
    2. logout_tokenパラメーターを抽出し、仕様に従って通常のJWTとして検証します。
    3. トークンに、JSONオブジェクト値とhttp://schemas.openid.net/event/backchannel-logoutという名前のメンバーを含むeventsクレームが含まれていることを確認します。
    4. トークンにsidクレームおよび/またはsubクレームが含まれていることを確認します。
    5. トークンにnonceクレームが含まれていないことを確認します。これは、不正使用を防止するために、ログアウトトークンとIDトークンを区別するのに必要です。
    6. トークンが検証されると、受信したsidsub値に対応するセッションを取得して終了します。実際のアプリケーションセッションの終了プロセスは、実装の詳細によって異なります。たとえば、このイベントはフロントエンドに知らせる必要があるかもしれません。

OIDCバックチャネルログアウト要求の例

エンコードされたトークンのペイロード:
cURL
POST /backchannel-logout HTTP/1.1
Host: rp.example.org
Content-Type: application/x-www-form-urlencoded

logout_token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImdwY3ZFT0FPREE2T3pXRmw3ODVxbCJ9.eyJpc3MiOiJodHRwczovL2FydGV4LWRldi5ldS5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NjAyZTkzZGI4M2ZhNmYwMDc0OWEyM2U2IiwiYXVkIjoiVHVoTkx2N3VsWEQzUmZ5TGxTTWJPdnN6endKSkZQcE8iLCJpYXQiOjE2OTgxNjA5MjgsImV4cCI6MTY5ODE2MTA0OCwianRpIjoiNDRhOTEyMTUtZGZiNC00ZGZlLWExZWItZmNhZmE5MTFkZWJhIiwiZXZlbnRzIjp7Imh0dHA6Ly9zY2hlbWFzLm9wZW5pZC5uZXQvZXZlbnQvYmFja2NoYW5uZWwtbG9nb3V0Ijp7fX0sInRyYWNlX2lkIjoiODFiMzM2YTk0YTRhNTcwNyIsInNpZCI6IjM3NVVJcF9JRDVtQ1RDbEllQkVIcFhmR3dxNTF0Rl9MIn0.aEoAL_U-EPlf3f7Fup-bu7Yv0S0GOnrkL8Njd6j6UNqZcr5VrWWFf3CWvkRi7Cm6wMgU2qIMhb7643ca8-ajR7zHlMu0Z3r-gfd2D1xudKLyUSC3v2D5WJZz5I8xMZ_LWtIN2W3l4SQFO9MgK_7F3x0WIWXo9KPC9tgOaOLPnsiv__MutM1ZakoCsJPddl5gVM4TYtHOue6WM7SOXZNa3SSiv57YQOX2KNCL7sWmZp_J1OXKy8lsgkNFqiOVwu39p4sgjKYEXQU0G-I0yY_aeNbnlnxFG6OuxaDt_zwg6AvKglLSNGqrrvzy4GsYJi5HMGZ1GsSs7rQLg7Iuu6JM-A
トークンの有効期間は2分間(120秒)です。
デコードされたトークンのペイロード:
JSON
{
   "iss": "https://artex-dev.eu.auth0.com/",
   "sub": "auth0|602e93db83fa6f00749a23e6",
   "aud": "TuhNLv7ulXD3RfyLlSMbOvszzwJJFPpO",
   "iat": 1698160928,
   "exp": 1698161048,
   "jti": "44a91215-dfb4-4dfe-a1eb-fcafa911deba",
   "events": {
         "http://schemas.openid.net/event/backchannel-logout": {}
   },
   "trace_id": "81b336a94a4a5707",
   "sid": "375UIp_ID5mCTClIeBEHpXfGwq51tF_L"
}

予期される応答

  • HTTP 200 :特定のアプリケーションでユーザーのログアウトが確認されました。
  • HTTP 400 :不正な要求です。要求が理解不可能か、トークンが検証に失敗しました。Auth0はテナントログに問題を記録しますが、特定のセッションに対してさらに要求を送ろうとはしません。

問題のトラブルシューティング

アプリケーションがログアウトイベントを取得しない

アプリケーションがログアウトイベント後にログアウト要求を取得しない場合には、以下を行います。
  1. アプリケーションが、Auth0 DashboardでバックチャネルログアウトURLに登録されていることを確認します。
  2. バックチャネルログアウトURLにAuth0テナントから到達できることを確認します。
  3. 有効なセッションが確立されていることを確認します。エンドユーザーはAuth0を介して特定のアプリケーションにログインしなければなりません。
    アプリケーションは、エンドユーザーがAuth0でそのアプリにログインしたときだけ、ログアウトイベントを受け取ります。エンドユーザーが他のアプリケーションにログインした場合、ログアウトイベントはトリガーされません。
  4. Auth0のテナントログで、ログアウトのメッセージ送信が失敗したというメッセージを確認します。
  5. ログアウトが標準のログアウトエンドポイントを通してトリガーされていることを確認します。他のイベントはログアウトイベントをトリガーしません。
  6. 可能であれば、Webサーバーのログとアプリケーションのファイアウォールのログで、阻止された要求を確認します。
  7. バックチャネルログアウトエンドポイントで有効な証明書(自己署名ではない)を使用していることを確認します。

OIDCバックチャネルログアウトのテナントログが見つからない

この機能は、2023年10月3日から、すべてのテナントに対して段階的にリリースされました。oidc_backchannel_logout_succeededにはsslooidc_backchannel_logout_failedにはfsloテナントログイベントコードが引き続き受信される場合があります。

クライアントアプリが受信したログアウトトークンを検証できない

トランザクションが400エラーで失敗する場合には、以下を行います。
  1. トークンが標準のBase64でエンコードされたJWTであることを確認します。Webサーバーによっては、長いパラメーターを切る詰めることがあります。詳細については、「署名アルゴリズム」をお読みください。
  2. 可能であれば、トークンをキャプチャして、JWTであることを確認します。JWT.IOなど、検証済みのソースを使用します。
  3. 検証機能がJSON Web Key Sets(JWKS)を通してテナントの署名キーを動的に取得することを確認します。
    静的キーをハードコードすることは推奨されません。静的キーをハードコードすることが構成の要件となっている場合は、Auth0テナントが生成した最新の公開鍵を必ず構成に含めてください。

応答タイムアウトエラー

Auth0はアプリケーションのOIDCバックチャネルログアウトの応答を5秒間待機します。その後、「Failed OIDC Back-Channel Logout request(OIDCバックチャネルログアウト要求の失敗)」を、応答の説明なくテナントログに記録します。

もっと詳しく

I