> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ネイティブアプリやモバイルアプリで、Proof Key for Code Exchange (PKCE) を使用する認可コードフローがどのように機能するか、また、なぜこれを使用すべきかを説明します。

# Proof Key for Code Exchange (PKCE) を使用する認可コードフロー

<Card title="概要">
  主なポイント

  * OAuth 2.0 のグラントタイプである、Proof Key for Code Exchange (PKCE) を使用する認可コードフローについて説明します。
  * ネイティブアプリやシングルページアプリなど、クライアントシークレットを保存できないアプリケーションでは、このグラントタイプを使用します。
  * Auth0 SDK を使用したさまざまな実装方法を確認します。
</Card>

<Tooltip tip="Public Client: 認証情報を安全に保持できないクライアント（アプリケーション）。たとえば、ネイティブのデスクトップアプリやモバイルアプリ、JavaScript ベースのクライアントサイド Web アプリケーション（シングルページアプリ（SPA）など）が含まれます。" cta="用語集を見る" href="/ja/docs/glossary?term=public+clients">パブリッククライアント</Tooltip> (例: ネイティブアプリケーションやシングルページアプリケーション) が<Tooltip tip="Public Client: 認証情報を安全に保持できないクライアント（アプリケーション）。たとえば、ネイティブのデスクトップアプリやモバイルアプリ、JavaScript ベースのクライアントサイド Web アプリケーション（シングルページアプリ（SPA）など）が含まれます。" cta="用語集を見る" href="/ja/docs/glossary?term=access+tokens">アクセストークン</Tooltip>を要求する場合、認可コードフローだけでは軽減できない追加のセキュリティ上の懸念が生じます。その理由は次のとおりです。

**ネイティブアプリ**

* <Tooltip tip="Client Secret: クライアント（アプリケーション）が認可サーバーに対して認証を行うために使用するシークレットです。クライアントと認可サーバーだけが知るべきものであり、推測されないよう十分にランダムである必要があります。" cta="用語集を見る" href="/ja/docs/glossary?term=Client+Secret">クライアントシークレット</Tooltip>を安全に保存できません。アプリを逆コンパイルすると、アプリに紐づき、すべてのユーザーとデバイスで共通の<Tooltip tip="Client Secret: クライアント（アプリケーション）が認可サーバーに対して認証を行うために使用するシークレットです。クライアントと認可サーバーだけが知るべきものであり、推測されないよう十分にランダムである必要があります。" cta="用語集を見る" href="/ja/docs/glossary?term=Client+Secret">クライアントシークレット</Tooltip>が明らかになります。
* 認可コードの傍受攻撃や注入攻撃に対して脆弱です。クライアントシークレットがなければ、認可コードを傍受した攻撃者はそれをトークンに交換できます。
* リダイレクトを受け取るためにカスタム URL スキーム (例: MyApp\://) を使用することがあり、その結果、悪意のあるアプリケーションが<Tooltip tip="Authorization Code: 認可サーバーによって生成されるランダムな文字列で、認可コードフロー（PKCE の有無を問わず）を使用する際に認可レスポンスの一部としてアプリケーションへ返されます。" cta="用語集を見る" href="/ja/docs/glossary?term=Authorization+Code">Authorization Code</Tooltip>をあなたの<Tooltip tip="Authorization Server: ユーザーのアクセス範囲の境界を定義する中央集約型サーバーです。たとえば、認可サーバーはユーザーが利用できるデータ、タスク、機能を制御できます。" cta="用語集を見る" href="/ja/docs/glossary?term=Authorization+Server">認可サーバー</Tooltip>から受け取ってしまう可能性があります。このリスクがあるため、**Auth0 はカスタム URI スキームの使用を強く非推奨としています**。詳しくは、[アプリケーションのなりすましを防ぐための対策](/ja/docs/secure/security-guidance/measures-against-app-impersonation.mdx)を参照してください。

**シングルページアプリ**

* ソースコード全体がブラウザから参照できるため、クライアントシークレットを安全に保存できません。

このような状況に対応するため、<Tooltip tip="OAuth 2.0: 認可プロトコルとワークフローを定義する認可フレームワークです。" cta="用語集を見る" href="/ja/docs/glossary?term=OAuth+2.0">OAuth 2.0</Tooltip> では、Proof Key for Code Exchange (PKCE) を使用する認可コードフローのバージョンが提供されています ([OAuth 2.0 RFC 7636](https://tools.ietf.org/html/rfc7636) で定義) 。

PKCE で強化された認可コードフローでは、呼び出し元のアプリケーションが作成し、<Tooltip tip="Authorization Server: ユーザーのアクセス範囲の境界を定義する中央集約型サーバーです。たとえば、認可サーバーはユーザーが利用できるデータ、タスク、機能を制御できます。" cta="用語集を見る" href="/ja/docs/glossary?term=authorization+server">認可サーバー</Tooltip>で検証できるシークレットが導入されます。このシークレットは Code Verifier と呼ばれます。さらに、呼び出し元のアプリは Code Verifier を変換した値である Code Challenge を作成し、この値を HTTPS 経由で送信して Authorization Code を取得します。これにより、悪意のある攻撃者が傍受できるのは Authorization Code のみとなり、Code Verifier がなければそれをトークンに交換できません。

<div id="how-it-works">
  ## 仕組み
</div>

PKCE で強化された 認可コードフロー は、[標準の 認可コードフロー](/ja/docs/get-started/authentication-and-authorization-flow/authorization-code-flow) をベースにしているため、手順はほぼ同じです。

<Frame>
  <img src="https://mintcdn.com/translations/3nS3prIggmJG9TUI/docs/images/cdy7uua7fh8z/3pstjSYx3YNSiJQnwKZvm5/33c941faf2e0c434a9ab1f0f3a06e13a/auth-sequence-auth-code-pkce.png?fit=max&auto=format&n=3nS3prIggmJG9TUI&q=85&s=6c413640df1409aac6572a553bae4164" alt="フロー - PKCE を使用した 認可コードフロー - 認可シーケンス図" width="1500" height="1220" data-path="docs/images/cdy7uua7fh8z/3pstjSYx3YNSiJQnwKZvm5/33c941faf2e0c434a9ab1f0f3a06e13a/auth-sequence-auth-code-pkce.png" />
</Frame>

1. ユーザーがアプリケーション内の **ログイン** をクリックします。
2. Auth0 の SDK は、暗号学的にランダムな `code_verifier` を生成し、それをもとに `code_challenge` を生成します。
3. Auth0 の SDK は、`code_challenge` とともにユーザーを Auth0 の認可サーバー ([`/authorize` エンドポイント](https://auth0.com/docs/api/authentication#authorization-code-grant-pkce-)) にリダイレクトします。
4. Auth0 の認可サーバーは、ユーザーをログインと認可のプロンプトにリダイレクトします。
5. ユーザーは設定されているログインオプションのいずれかを使って認証し、Auth0 がアプリケーションに付与する権限が一覧表示された同意ページが表示されることがあります。
6. Auth0 の認可サーバーは `code_challenge` を保存し、1 回限り使用可能な認可 `code` とともにユーザーをアプリケーションへリダイレクトします。
7. Auth0 の SDK は、この `code` と `code_verifier` (手順 2 で生成) を Auth0 の認可サーバー `(`[`/oauth/token` エンドポイント](https://auth0.com/docs/api/authentication?http#authorization-code-flow-with-pkce44)) に送信します。
8. Auth0 の認可サーバーは `code_challenge` と `code_verifier` を検証します。
9. Auth0 の認可サーバーは、IDトークンとアクセストークン (必要に応じてリフレッシュトークンも) を返します。
10. アプリケーションはアクセストークンを使用して API を呼び出し、ユーザーに関する情報にアクセスできます。
11. API は要求されたデータを返します。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  [Refresh Token Rotation](/ja/docs/secure/tokens/refresh-tokens/refresh-token-rotation) を有効にしている場合は、リクエストのたびに新しいリフレッシュトークンが生成され、アクセストークンとともに発行されます。リフレッシュトークンが交換されると、直前のリフレッシュトークンは無効になりますが、その関連情報は認可サーバーに保持されます。
</Callout>

<div id="how-to-implement-it">
  ## 実装方法
</div>

PKCE を使用する 認可コードフロー を実装する最も簡単な方法は、[Native Quickstarts](/ja/docs/quickstart/native) または [Single-Page Quickstarts](/ja/docs/quickstart/spa) に従うことです。

アプリケーションの種類に応じて、モバイルアプリ向けまたはシングルページアプリ向けの SDK を使用することもできます。

**モバイル**

* [Auth0 Swift SDK](/ja/docs/libraries/auth0-swift)
* [Auth0 Android SDK](/ja/docs/libraries/auth0-android)

**シングルページ**

* [Auth0 Single-Page App SDK](/ja/docs/libraries/auth0-single-page-app-sdk)
* [Auth0 React SDK](/ja/docs/libraries/auth0-react)

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  ブラウザーにおけるユーザープライバシー制御の最近の進展により、サードパーティ Cookie へのアクセスが制限され、ユーザー体験に悪影響が生じています。そのため、ブラウザーベースのフローでは [Refresh Token Rotation](/ja/docs/secure/tokens/refresh-tokens/refresh-token-rotation) を使用する必要があります。これにより、SPA でリフレッシュトークンを安全に使用できるだけでなく、ITP などのブラウザープライバシー技術による UX の中断を避けながら、エンドユーザーがリソースにシームレスにアクセスできるようになります。
</Callout>

チュートリアルに従って API エンドポイントを使用し、[Add Login Using the 認可コードフロー with PKCE](/ja/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/add-login-using-the-authorization-code-flow-with-pkce) または [Call Your API Using the 認可コードフロー with PKCE](/ja/docs/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/call-your-api-using-the-authorization-code-flow-with-pkce) を実装できます。

<div id="learn-more">
  ## 詳細情報
</div>

* [Auth0 Rules](/ja/docs/customize/rules)
* [Auth0 Hooks](/ja/docs/customize/hooks)
* [トークン](/ja/docs/secure/tokens)
* [トークンのベストプラクティス](/ja/docs/secure/tokens/token-best-practices)
* [使用すべき OAuth 2.0 フロー](/ja/docs/get-started/authentication-and-authorization-flow/which-oauth-2-0-flow-should-i-use)
