> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-fix-docs-5528-php-updates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# OIDCエンドポイントを使用してユーザーをAuth0からログアウトさせる

> OIDCログアウトエンドポイントを使用してユーザーをログアウトさせる方法について説明します。

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASKED*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

export const codeExample1 = `https://{yourDomain}/oidc/logout?id_token_hint={yourIdToken}&post_logout_redirect_uri={yourCallbackUrl}`;

export const codeExample2 = `curl --request GET \\
  --url 'https://{yourDomain}/oidc/logout' \\
  --header 'content-type: application/x-www-form-urlencoded' \\
  --data 'id_token_hint={yourIdToken}' \\
  --data 'post_logout_redirect_uri={yourCallbackUrl}'`;

export const codeExample3 = `https://{yourDomain}/oidc/logout?{clientId}={yourClientId}&logout_hint={sessionId}`;

export const codeExample4 = `https://{yourDomain}/oidc/logout?post_logout_redirect_uri=http%3A%2F%2Fwww.example.com`;

export const codeExample5 = `PATCH https://{yourDomain}/api/v2/clients/{clientId}
Authorization: Bearer {yourMgmtApiAccessToken}
Content-Type: application/json

{
  "allowed_logout_urls": [
    "https://www.example.com",
    "https://www.example.com/logout"
  ]
}
`;

export const codeExample6 = `PATCH https://{yourDomain}/api/v2/tenants/settings
Authorization: Bearer {yourMgmtApiAccessToken}
Content-Type: application/json

{
  "allowed_logout_urls": [
    "https://www.example.com",
    "https://www.example.com/logout"
  ]
}
`;

Auth0では、エンドユーザーのログアウトに<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=openid" tip="OpenID: アプリケーションがログイン情報を収集および保存することなくにユーザーのIDを検証できるようにする認証用のオープン標準。" cta="用語集の表示">OpenID</Tooltip> Connectの[RP-Initiated Logout 1.0](https://openid.net/specs/openid-connect-rpinitiated-1_0.html)を実装しています。この仕様は、OpenID Connectによる[最終仕様](https://openid.net/developers/specs/)の一部です。

## 仕組み

RP起点のログアウトは、証明書利用者（ユーザー）がOpenIDプロバイダー（Auth0）にログアウトを要求するシナリオです。

1. ユーザーはアプリケーションでログアウト要求を開始します。
2. アプリケーションはユーザーをAuth0のAuthentication APIの[OIDCログアウト](/docs/ja-jp/api/authentication#oidc-logout)エンドポイントに送ります。
3. Auth0は、提供された[OIDCログアウトエンドポイントのパラメーター](#oidc-logout-endpoint-parameters)を基に、ユーザーを適切な場所にリダイレクトします。

## RP起点のログアウトを構成する

RP起点のログアウトを構成するには、アプリケーションがAuth0テナントの[検出メタデータドキュメント](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig)内で`end_session_endpoint`パラメーターを見つけられること、そして必要なパラメーターを使ってOIDCログアウトエンドポイントを呼び出すことを確認する必要があります。

### エンドポイント検出を有効にする

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  2023年11月14日以降に作成されたAuth0テナントに対しては、 **［RP-Initiated Logout End Session Endpoint Discovery（RP起点のログアウトのセッション終了エンドポイント検出）］** がデフォルトで有効に設定されています。
</Callout>

**RP-Initiated Logout End Session Endpoint Discovery（RP起点のログアウトのセッション終了エンドポイント検出）** は、<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=auth0-dashboard" tip="Auth0 Dashboard: サービスを構成するためのAuth0の主製品。" cta="用語集の表示">Auth0 Dashboard</Tooltip>またはAuth0 <Tooltip data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=management-api" tip="Management API: 顧客が管理タスクを実行できるようにするための製品。" cta="用語集の表示">Management API</Tooltip>を使用して有効にすることができます。

<Tabs>
  <Tab title="Dashboard（ダッシュボード）">
    Dashboard（ダッシュボード）の **［RP-Initiated Logout End Session Endpoint Discovery（RP起点のログアウトエンドセッションエンドポイント検出）］** を有効にする方法：

    1. [［Dashboard（ダッシュボード）］ > ［Settings（設定）］ > ［Advanced（詳細設定）］](https://manage.auth0.com/#/tenant/advanced)に移動します。
    2. **［Login and Logout（ログインとログアウト）］** セクションを見つけます。
    3. **［RP-Initiated Logout End Session Endpoint Discovery（RP起点のログアウトエンドセッションエンドポイント検出）］** の切り替えを有効にします。
  </Tab>

  <Tab title="Mangement API">
    Management APIで **［RP-Initiated Logout End Session Endpoint Discovery（RP起点のログアウトエンドセッションエンドポイント検出）］** を有効にする方法：

    1. `update:tenant_settings`スコープを持つ[Management APIのアクセストークンを取得します](/docs/ja-jp/secure/tokens/access-tokens/management-api-access-tokens/get-management-api-access-tokens-for-production)。
    2. 次のペイロードで、Management APIの[テナント設定の更新](/docs/ja-jp/api/management/v2/tenants/patch-settings)を呼び出します。

       ```json JSON lines theme={null}
       {
         "oidc_logout": {
           "rp_logout_end_session_endpoint_discovery": true
         }
       }
       ```
  </Tab>
</Tabs>

### OIDCログアウトエンドポイントを呼び出す

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Auth0の[SDKライブラリー](/docs/ja-jp/libraries)のほとんどは、OIDCに準拠しており、RP起点のログアウトをサポートするように設計されています。
</Callout>

OIDCログアウトエンドポイントを呼び出す際に、Auth0では`id_token_hint`パラメーターの提供を推奨しています。

使用しているアプリケーションがIDトークンを安全に保管できない場合は、代わりに`logout_hint`と`client_id`パラメーターを提供することができます。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  冗長情報を使ってOIDCログアウトエンドポイントを呼び出すことができます。

  たとえば、`id_token_hint`パラメーターと`logout_hint`パラメーターを送るか、`id_token_hint`パラメーターと`client_id`パラメーターを送ります。

  どちらの場合も、Auth0は、ユーザーとセッションデータに矛盾がないことを確認し、食い違いがある場合はエラーを返します。
</Callout>

#### OIDCログアウトエンドポイントのパラメーター

Authentication APIの[OIDCログアウト](/docs/ja-jp/api/authentication#oidc-logout)エンドポイントは、以下のパラメーターに対応しています。

| パラメーター                     | 必要？ | 説明                                                                               |
| -------------------------- | --- | -------------------------------------------------------------------------------- |
| `id_token_hint`            | 推奨  | 以前ユーザーに発行されたIDトークン。ログアウトさせるユーザーを示します。                                            |
| `logout_hint`              | 任意  | どのユーザーをログアウトさせるかを示すセッションID（`sid`）値。                                              |
| `post_logout_redirect_uri` | 任意  | ユーザーをログアウト後にリダイレクトする場所を示すリダイレクトURL値。                                             |
| `client_id`                | 任意  | アプリケーションのクライアントID。                                                               |
| `federated`                | 任意  | ユーザーをIDプロバイダーからログアウトするようAuth0に指示。                                                |
| `state`                    | 任意  | アプリケーションが最初のログアウト要求に追加し、Auth0が`post_logout_redirect_uri`にリダイレクトするときに含める不透明な値。    |
| `ui_locales`               | 任意  | 要求の言語リストを制限するために使用される、スペース区切りのロケールリスト。リストの最初のロケールはテナントで有効になっているロケールと一致する必要があります。 |

#### id\_token\_hintパラメーター

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  OIDCログアウトエンドポイントを呼び出す際には、`id_token_hint`パラメーターの使用をお勧めします。
</Callout>

`id_token_hint`パラメーターの値は、ユーザーの認証後にAuth0がユーザーに対して発行したIDトークンでなければなりません。

このIDトークンには、登録クレームの発行者（`iss`）、オーディエンス（`aud`）、Auth0セッションID（`sid`）が検証のために含まれています。IDトークンのクレームについては、「[IDトークンの構造](/docs/ja-jp/secure/tokens/id-tokens/id-token-structure)」をお読みください。

##### 例

<Tabs>
  <Tab title="HTTP">
    <AuthCodeBlock children={codeExample1} language="http" filename="HTTP" />
  </Tab>

  <Tab title="cURL">
    <AuthCodeBlock children={codeExample2} language="bash" filename="cURL" />
  </Tab>
</Tabs>

#### logout\_hintパラメーター

`logout_hint`パラメーターの値は、ユーザーの現在のAuth0セッションのセッションID（`sid`）でなければなりません。

このセッションID（`sid`）は登録クレームとして提供され、ユーザーの認証後にAuth0がユーザーに対して発行したIDトークンに含まれています。

<Warning>
  現在のセッションを開始する際に、Auth0発行のIDトークンに関連付けられているセッションID（`sid`）を使う必要があります。Auth0では、ランダムな値や現在のセッションデータを反映していない値のある要求は無視されます。
</Warning>

##### 例

<AuthCodeBlock children={codeExample3} language="http" />

#### post\_logout\_redirect\_uriパラメーター

`post_logout_redirect_uri`パラメーターの値は、エンコードされた有効なURLとして、以下で **Allowed Logout URLs（許可されているログアウトURL）** リストに登録されていなければなりません。

1. [アプリケーションの設定](/docs/ja-jp/get-started/applications/application-settings#application-uris)：`id_token_hint`パラメーター、または`logout_hint`パラメーターと`client_id`パラメーターを提供した場合
2. [テナントの設定](/docs/ja-jp/get-started/tenant-settings#login-and-logout)：`logout_hint`パラメーターのみを提供した場合。

##### 例

<AuthCodeBlock children={codeExample4} language="http" filename="HTTP" />

##### アプリケーションのAllowed Logout URLs（許可されているログアウトURL）を更新する

URLをアプリケーションの **Allowed Logout URLs（許可されているログアウトURL）** リストに登録するには、Auth0 DashboardまたはAuth0 Management APIを使用することができます。

<Tabs>
  <Tab title="Dashboard（ダッシュボード）">
    Dashboard（ダッシュボード）で **［Allowed Logout URLs（許可されているログアウトURL）］** のアプリケーションリストでURLを登録する方法：

    1. [［Dashboard（ダッシュボード）］ > ［Applications（アプリケーション）］ > ［Applications（アプリケーション）］](https://manage.auth0.com/#/applications)に移動します。
    2. アプリケーションを選択します。
    3. **［Application URIs（アプリケーションURL）］** セクションを見つけます。
    4. [提供されたガイドライン](#allowed-logout-urls-guidelines)に従って、 **［Allowed Logout URLs（許可されているログアウトURL）］** を更新します。
  </Tab>

  <Tab title="Mangement API">
    <Warning>
      Management APIの[クライアントの更新](/docs/ja-jp/api/management/v2/clients/patch-clients-by-id)エンドポイントを呼び出すと、要求本文のフィールドにある既存のすべての構成データが上書きされます。

      誤ってデータを消失しないために、まず、Management APIの[クライアントの取得](/docs/ja-jp/api/management/v2/clients/get-clients-by-id)エンドポイントを呼び出し、現在のアプリケーションの構成データを取得します。
    </Warning>

    Management APIから **［Allowed Logout URLs（許可されているログアウトURL）］** のアプリケーションリストでURLを登録する方法：

    1. `update:clients`スコープを含む[Management APIのアクセストークンを取得](https://auth0.com/docs/secure/tokens/access-tokens/get-management-api-access-tokens-for-production)します。
    2. Management APIの[クライアントの更新](https://auth0.com/docs/api/management/v2/clients/patch-clients-by-id) エンドポイントを呼び出し、要求本文の`allowed_logout_urls`フィールド値にURLを含むようにしてください。

    <AuthCodeBlock children={codeExample5} language="http" />
  </Tab>
</Tabs>

##### テナントのAllowed Logout URLs（許可されているログアウトURL）を更新する

URLをテナントの **Allowed Logout URLs（許可されているログアウト）** リストに登録するには、Auth0 DashboardまたはAuth0 Management APIを使用することができます。

<Tabs>
  <Tab title="Dashboard（ダッシュボード）">
    Dashboard（ダッシュボード）で **［Allowed Logout URLs（許可されているログアウトURL）］** のテナントリストでURLを登録する方法：

    1. [［Dashboard（ダッシュボード）］ > ［Settings（設定）］ > ［Advanced（詳細設定）］](https://manage.auth0.com/#/tenant/advanced)に移動します。
    2. **［Login and Logout（ログインとログアウト）］** セクションを見つけます。
    3. [提供されたガイドライン](#allowed-logout-urls-guidelines)に従って、 **Allowed Logout URLs（許可されているログアウトURL）** を更新します。
  </Tab>

  <Tab title="Mangement API">
    <Warning>
      Management APIの[テナント設定の更新](/docs/ja-jp/api/management/v2/tenants/patch-settings)エンドポイントを呼び出すと、要求本文のフィールドにある既存のすべての構成データが上書きされます。

      誤ってデータを消失しないために、まず、Management APIの[テナント設定の取得](/docs/ja-jp/api/management/v2/tenants/tenant-settings-route)エンドポイントを呼び出し、現在のテナントの構成データを取得します。
    </Warning>

    Management APIから **［Allowed Logout URLs（許可されているログアウトURL）］** のテナントリストでURLを登録する方法：

    1. `update:tenant_settings`スコープを含む[Management APIのアクセストークンを取得](/docs/ja-jp/secure/tokens/access-tokens/management-api-access-tokens/get-management-api-access-tokens-for-production)します。
    2. Management APIの[テナント設定の更新](/docs/ja-jp/api/management/v2/tenants/patch-settings)エンドポイントを呼び出し、要求本文の`allowed_logout_urls`フィールド値にURLを含むようにしてください。

    <AuthCodeBlock children={codeExample6} language="http" />
  </Tab>
</Tabs>

##### Allowed Logout URLs（許可されているログアウトURL）のガイドライン

**Allowed Logout URLs（許可されているログアウト）** の更新では、検証エラーを避けるために以下のガイドラインに従ってください。

* 複数のURL値はカンマ（`,`）で区切ります。
* URLのスキーム部分を含めます（例：`https://`）。

サブドメインにはアスタリスク（`*`）をワイルドカードとして使用（例：`https://*.example.com`）できますが、運用環境ではワイルドカードの使用はお勧めしません。詳細については、「[サブドメインURLのプレースホルダー](/docs/ja-jp/get-started/applications/wildcards-for-subdomains#wildcard-url-placeholders)」をお読みください。

##### post\_logout\_redirect\_uriにクエリ文字列パラメーターを追加する

OIDCログアウトエンドポイントは、`post_logout_redirect_uri`パラメーターに提供されたURLのクエリ文字列パラメーターを解析します。

**クエリ文字列パラメーターを含む正確なURL**を**Allowed Logout URLs（許可されているログアウトURL）** に含める必要があります。含まれていない場合には、ログアウト要求が拒否されます。URLは、すべてのクエリパラメーター名と値を含め、正確に一致する必要があります。

たとえば、`https://example.com/logout?myParam=1234`を`post_logout_redirect_uri`パラメーター（`https%3A%2F%2Fexample.com%2Flogout%3FmyParam%3D1234`としてエンコード）に渡す場合は、完全なURL `https://example.com/logout?myParam=1234`を **Allowed Logout URLs（許可されているログアウトURL）** に含める必要があります。

<Warning>
  動的なクエリパラメーター値はサポートされていません。クエリパラメーター名と値の一意の組み合わせごとに、**Allowed Logout URLs（許可されているログアウトURL）** に個別のエントリとして登録する必要があります。
</Warning>

#### ui\_localesパラメーター

`ui_locales`パラメーターの値は、[対応ロケール](/docs/ja-jp/customize/internationalization-and-localization/universal-login-internationalization#new-universal-login-experience-localization)がスペースで区切られてリストされていなければなりません。

リストにある最初の値は、[テナントのデフォルト言語設定](/docs/ja-jp/get-started/tenant-settings#languages)と一致しなければなりません。

#### federatedパラメーター

`federated`パラメーターは値を必要としません。

OIDCログアウトエンドポイントの呼び出しにfederatedパラメーターを含めた場合、Auth0はそれらの[IDプロバイダーからユーザーをログアウト](/docs/ja-jp/authenticate/login/logout/log-users-out-of-idps)させようとします。

## ログアウト同意プロンプト

OIDC仕様では、エンドユーザーがログアウト要求を行ったということを、OpenIDプロバイダーが確認できない場合には、ログアウトフローがユーザーの同意を求めるために中断されると定義されています。

Auth0では、以下のいずれかの条件を検出した場合に、ログアウト同意プロンプトを表示することでこの動作を強制します。

* `id_token_hint`パラメーターと`logout_hint`パラメーターがどちらも提供されていない
* IDトークンの`sid`クレームが要求にあるブラウザーセッションに対応していない
* `logout_hint`パラメーターの値が現在のセッションデータと一致していない

<Frame>
  <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/edu3KASxfgCs4dqF/docs/images/ja-jp/cdy7uua7fh8z/5Sycg1aMJ1CLZwJj19Omv4/149311ab6d17d1bf0ab9dcec4fd2e76d/Logout_-_Japanese.png?fit=max&auto=format&n=edu3KASxfgCs4dqF&q=85&s=ef6f6a1e423425ac17b90fe72963c9f5" alt="null" width="496" height="669" data-path="docs/images/ja-jp/cdy7uua7fh8z/5Sycg1aMJ1CLZwJj19Omv4/149311ab6d17d1bf0ab9dcec4fd2e76d/Logout_-_Japanese.png" />
</Frame>

ユーザーがログアウト要求を確認すると、Auth0はログアウトフローを続行します。

### ログアウトの同意プロンプトを無効にする

ログアウトの同意プロンプトは無効にすることができます。無効にすると、Auth0は異常な動作を検出しようとしないで、ログアウト要求を自動的に受け入れます。

Dashboardを使ってログアウトの同意プロンプトを無効にするには、以下を行います。

1. [［Dashboard］>［設定］>［Advanced（詳細設定）］](https://manage.auth0.com/#/tenant/advanced)に移動します。
2. **［Show RP-Initiated Logout End-User Confirmation（RP起点のログアウトにエンドユーザー確認を表示する）］** を無効にします。

   <Frame>
     <img src="https://mintcdn.com/docs-dev-fix-docs-5528-php-updates/AGJKQ70LznL5pcXe/docs/images/ja-jp/cdy7uua7fh8z/37K4hLjhSBMGvdGP9OEP7W/2ea2e8542e0041684e331e6bebd591d5/Login_and_Logout_-_Japanese.png?fit=max&auto=format&n=AGJKQ70LznL5pcXe&q=85&s=97648ecbb1bc7f37593fc1e837393c48" alt="null" width="1002" height="1125" data-path="docs/images/ja-jp/cdy7uua7fh8z/37K4hLjhSBMGvdGP9OEP7W/2ea2e8542e0041684e331e6bebd591d5/Login_and_Logout_-_Japanese.png" />
   </Frame>

## もっと詳しく

* [アプリケーションからユーザーをログアウトする](/docs/ja-jp/authenticate/login/logout/log-users-out-of-applications)
* [ユーザーをIDプロバイダーからログアウトさせる](/docs/ja-jp/authenticate/login/logout/log-users-out-of-idps)
* [ユーザーをSAML IDプロバイダーからログアウトする](/docs/ja-jp/authenticate/login/logout/log-users-out-of-saml-idps)
* [代替ログアウトでユーザーをリダイレクトする](/docs/ja-jp/authenticate/login/logout/redirect-users-after-logout)
