概要
主なポイント
- OAuth 2.0 のグラントタイプである、Proof Key for Code Exchange (PKCE) を使用する認可コードフローについて説明します。
- ネイティブアプリやシングルページアプリなど、クライアントシークレットを保存できないアプリケーションでは、このグラントタイプを使用します。
- Auth0 SDK を使用したさまざまな実装方法を確認します。
- を安全に保存できません。アプリを逆コンパイルすると、アプリに紐づき、すべてのユーザーとデバイスで共通のが明らかになります。
- 認可コードの傍受攻撃や注入攻撃に対して脆弱です。クライアントシークレットがなければ、認可コードを傍受した攻撃者はそれをトークンに交換できます。
- リダイレクトを受け取るためにカスタム URL スキーム (例: MyApp://) を使用することがあり、その結果、悪意のあるアプリケーションがをあなたのから受け取ってしまう可能性があります。このリスクがあるため、Auth0 はカスタム URI スキームの使用を強く非推奨としています。詳しくは、アプリケーションのなりすましを防ぐための対策を参照してください。
- ソースコード全体がブラウザから参照できるため、クライアントシークレットを安全に保存できません。
仕組み

- ユーザーがアプリケーション内の ログイン をクリックします。
- Auth0 の SDK は、暗号学的にランダムな
code_verifierを生成し、それをもとにcode_challengeを生成します。 - Auth0 の SDK は、
code_challengeとともにユーザーを Auth0 の認可サーバー (/authorizeエンドポイント) にリダイレクトします。 - Auth0 の認可サーバーは、ユーザーをログインと認可のプロンプトにリダイレクトします。
- ユーザーは設定されているログインオプションのいずれかを使って認証し、Auth0 がアプリケーションに付与する権限が一覧表示された同意ページが表示されることがあります。
- Auth0 の認可サーバーは
code_challengeを保存し、1 回限り使用可能な認可codeとともにユーザーをアプリケーションへリダイレクトします。 - Auth0 の SDK は、この
codeとcode_verifier(手順 2 で生成) を Auth0 の認可サーバー(/oauth/tokenエンドポイント) に送信します。 - Auth0 の認可サーバーは
code_challengeとcode_verifierを検証します。 - Auth0 の認可サーバーは、IDトークンとアクセストークン (必要に応じてリフレッシュトークンも) を返します。
- アプリケーションはアクセストークンを使用して API を呼び出し、ユーザーに関する情報にアクセスできます。
- API は要求されたデータを返します。
Refresh Token Rotation を有効にしている場合は、リクエストのたびに新しいリフレッシュトークンが生成され、アクセストークンとともに発行されます。リフレッシュトークンが交換されると、直前のリフレッシュトークンは無効になりますが、その関連情報は認可サーバーに保持されます。
実装方法
ブラウザーにおけるユーザープライバシー制御の最近の進展により、サードパーティ Cookie へのアクセスが制限され、ユーザー体験に悪影響が生じています。そのため、ブラウザーベースのフローでは Refresh Token Rotation を使用する必要があります。これにより、SPA でリフレッシュトークンを安全に使用できるだけでなく、ITP などのブラウザープライバシー技術による UX の中断を避けながら、エンドユーザーがリソースにシームレスにアクセスできるようになります。