> ## 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.

> PKCE を使用した Authorization Code フローの仕組みと、これを Native アプリやモバイルアプリで使用すべき理由を学びます。

# PKCE を使用した Authorization Code フロー

<Card title="概要">
  主な概念

  * OAuth 2.0 のグラントタイプである、PKCE を使用した Authorization Code フローについて学びます。
  * Native アプリやシングルページアプリのように、Client Secret を保存できないアプリケーションには、このグラントタイプを使用します。
  * Auth0 SDK を使用したさまざまな実装方法を確認します。
</Card>

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

**Native アプリ**

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

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

* ソースコード全体をブラウザから参照できるため、Client Secret を安全に保存できません。

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

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

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

PKCE で強化された[標準の認可コードフロー](/docs/ja-jp/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="Flows - 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のローテーション](/docs/ja-jp/secure/tokens/refresh-tokens/refresh-token-rotation) が有効になっている場合、リクエストのたびに新しいリフレッシュトークンが生成され、アクセストークンとあわせて発行されます。リフレッシュトークンが交換されると、以前のリフレッシュトークンは無効化されますが、その関係に関する情報は認可サーバーに保持されます。
</Callout>

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

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

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

**モバイル**

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

**シングルページ**

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

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

チュートリアルに従って API エンドポイントを使用し、[PKCE を使用した 認可コードフローでログインを追加する](/docs/ja-jp/get-started/authentication-and-authorization-flow/authorization-code-flow-with-pkce/add-login-using-the-authorization-code-flow-with-pkce) または [PKCE を使用した 認可コードフローで API を呼び出す](/docs/ja-jp/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](/docs/ja-jp/customize/rules)
* [Auth0 Hooks](/docs/ja-jp/customize/hooks)
* [トークン](/docs/ja-jp/secure/tokens)
* [トークンのベストプラクティス](/docs/ja-jp/secure/tokens/token-best-practices)
* [どの OAuth 2.0 フローを使用すべきですか？](/docs/ja-jp/get-started/authentication-and-authorization-flow/which-oauth-2-0-flow-should-i-use)
