Skip to main content

概要

主な概念
  • OAuth 2.0 のグラントタイプである、PKCE を使用した Authorization Code フローについて学びます。
  • Native アプリやシングルページアプリのように、Client Secret を保存できないアプリケーションには、このグラントタイプを使用します。
  • Auth0 SDK を使用したさまざまな実装方法を確認します。
(例: Native アプリケーションやシングルページアプリケーション) がを要求する場合、認可コードフローだけでは軽減できない追加のセキュリティ上の懸念が生じます。その理由は次のとおりです。 Native アプリ
  • を安全に保存できません。アプリを逆コンパイルすると、アプリにひも付けられていて、すべてのユーザーとデバイスで共通の が明らかになります。
  • 認可コードの傍受攻撃や注入攻撃に対して脆弱です。Client Secret がなければ、認可コードを傍受した攻撃者はそれをトークンと交換できます。
  • リダイレクトを受け取るためにカスタム URL スキーム (例: MyApp://) を使用することがあり、その場合、悪意のあるアプリケーションが使用中のから受け取れてしまう可能性があります。このリスクがあるため、Auth0 はカスタム URI スキームの使用を強く非推奨としています。詳しくは、アプリケーションのなりすまし対策 を参照してください。
シングルページアプリ
  • ソースコード全体をブラウザから参照できるため、Client Secret を安全に保存できません。
このような状況を踏まえ、 では、PKCE を使用した Authorization Code フローが提供されています (OAuth 2.0 RFC 7636 で定義) 。 PKCE で強化された認可コードフローでは、呼び出し元のアプリケーションが作成した秘密をが検証できます。この秘密は Code Verifier と呼ばれます。さらに、呼び出し元アプリは Code Verifier を変換して得られる値である Code Challenge を作成し、この値を HTTPS 経由で送信して認可コードを取得します。これにより、悪意のある攻撃者が傍受できるのは認可コードだけであり、Code Verifier がなければそれをトークンと交換できません。

仕組み

PKCE で強化された標準の認可コードフローをベースにしているため、手順は非常によく似ています。
Flows - PKCE 付き認可コード - 認可シーケンス図
  1. ユーザーがアプリケーション内で ログイン をクリックします。
  2. Auth0 の SDK が、暗号学的にランダムな code_verifier を作成し、そこから code_challenge を生成します。
  3. Auth0 の SDK は、code_challenge とともにユーザーを Auth0 認可サーバー (/authorize エンドポイント) にリダイレクトします。
  4. Auth0 認可サーバーは、ユーザーをログインおよび認可のプロンプトにリダイレクトします。
  5. ユーザーは設定済みのログインオプションのいずれかで認証し、Auth0 がアプリケーションに付与する権限が一覧表示された同意ページが表示されることがあります。
  6. Auth0 認可サーバーは code_challenge を保存し、1 回限り有効な認可 code を付けてユーザーをアプリケーションにリダイレクトします。
  7. Auth0 の SDK は、この codecode_verifier (手順 2 で作成) を Auth0 認可サーバー (/oauth/token エンドポイント) に送信します。
  8. Auth0 認可サーバーは code_challengecode_verifier を検証します。
  9. Auth0 認可サーバーは、ID トークンとアクセストークン (必要に応じてリフレッシュトークンも) を返します。
  10. アプリケーションは、アクセストークンを使って API を呼び出し、ユーザーに関する情報にアクセスできます。
  11. API は要求されたデータを返します。
Refresh Tokenのローテーション が有効になっている場合、リクエストのたびに新しいリフレッシュトークンが生成され、アクセストークンとあわせて発行されます。リフレッシュトークンが交換されると、以前のリフレッシュトークンは無効化されますが、その関係に関する情報は認可サーバーに保持されます。

実装方法

PKCE を使用した 認可コードフローを実装する最も簡単な方法は、Native Quickstarts または Single-Page Quickstarts に従うことです。 アプリケーションの種類に応じて、モバイル向けまたはシングルページアプリ向けの SDK を使用することもできます。 モバイル シングルページ
近年、ブラウザのユーザープライバシー制御の強化により、サードパーティ Cookie へのアクセスが妨げられ、ユーザー体験に悪影響が生じています。そのため、ブラウザベースのフローでは Refresh Tokenのローテーション を使用する必要があります。これにより、SPA でリフレッシュトークンを安全に使用できるようになり、ITP のようなブラウザのプライバシー技術による UX の中断を回避しつつ、エンドユーザーはリソースにシームレスにアクセスできます。
チュートリアルに従って API エンドポイントを使用し、PKCE を使用した 認可コードフローでログインを追加する または PKCE を使用した 認可コードフローで API を呼び出す ことができます。

さらに詳しく