メインコンテンツへスキップ

Overview

重要なコンセプト
  • OAuth 2.0の付与タイプ、Proof Key for Code Exchange(PKCE)での認可コードフローの詳細を確認する
  • ネイティブアプリやシングルページアプリなど、クライアントシークレットを保管できないアプリケーションにこの付与タイプを使用する
  • Auth0 SDKを使った各種の実装方法を確認する
パブリッククライアント(例:ネイティブおよびシングルページアプリケーション)がアクセストークンを要求した際に、認可コードフローだけでは軽減しきれないセキュリティ上の懸念が提起されていました。これは以下の理由によるものです。 ネイティブアプリ
  • アプリが を安全に保管できません。アプリを逆コンパイルすると、クライアントシークレットが暴露されます。クライアントシークレットはアプリにバインドされるものであり、すべてのユーザーとデバイスについても同様です。
  • カスタムURLスキームを利用して、リダイレクト(「MyApp://」など)をキャプチャできる可能性があるため、悪意のあるアプリケーションが から取得できる可能性があります。
シングルページアプリ
  • ブラウザーがソース全体を使用できるため、クライアントシークレットを安全に保管できません。
これらの状況を踏まえて、は認可コードフローにProof Key for Code Exchange(PKCE)を活用した1つのバージョンを提供しています(OAuth 2.0 RFC 7636に定義)。 PKCEで拡張された認可コードフローではCode Verifierと呼ばれるシークレットを導入しました。このシークレットは、認可サーバーが検証したアプリケーションを呼び出すことによって作成されます。また、アプリを呼び出すと、Code VerifierからCode Challengeと呼ばれる変換値が作成され、この値がHTTPSで認可コードを取得するために送信されます。これで、悪意のある攻撃者が傍受できるのは認可コードだけとなり、Code Verifierがないため、それをトークンと交換できなくなります。

仕組み

PKCEで拡張された認可コードフローは標準の認可コードフローに基づいているため、手順は非常に似ています。
フロー - PKCEを使った認可コード - 認可シーケンスの図
  1. ユーザーがアプリケーション内で [Login(ログイン)] をクリックします
  2. Auth0のSDKは暗号的にランダムなcode_verifierを作成し、そこからcode_challengeを生成します。
  3. Auth0のSDKはcode_challengeとともにユーザーをAuth0の認証サーバー(/authorizeエンドポイント)にリダイレクトします。
  4. Auth0の認可サーバーがユーザーをログインにリダイレクトして、認可を促します。
  5. ユーザーが構成されたログインオプションの1つを使用して認証を行い、Auth0がアプリケーションに付与する許可をリストした同意ページが表示されることもあります。
  6. Auth0の認可サーバーはcode_challengeを保存し、1回限り使用できる認可コードでユーザーをアプリケーションにリダイレクトします。
  7. Auth0のSDKは、このコードcode_verifier(手順2で作成)をAuth0の認可サーバー/oauth/tokenエンドポイント)に送信します。
  8. Auth0の認可サーバーはcode_challengecode_verifierを検証します。
  9. Auth0の認可サーバーが、IDトークンとアクセストークン(リフレッシュトークンは任意)で応答します。
  10. アプリケーションがアクセストークンを使ってAPIを呼び出し、ユーザーについての情報にアクセスします。
  11. APIが要求データで応答します。
Refresh Token Rotation(リフレッシュトークンのローテーション)を有効にすると、要求のたびに新しいリフレッシュトークンが生成され、アクセストークンと共に発行されます。リフレッシュトークンが交換されると、前のリフレッシュトークンは失効しますが、関係についての情報は認可サーバーによって維持されます。

実装方法

PKCEで認可コードフローを最も簡単に実装するには、「ネイティブクイックスタート」または「シングルページクイックスタート」に従うことです。 アプリケーションタイプによっては、モバイルやシングルページアプリのSDKを使用することもできます。 モバイル シングルページアプリ
近年、ブラウザーのユーザープライバシー制御機能が発達し、サードパーティクッキーがブロックされることでユーザーエクスペリエンスに悪影響を与えています。そのため、ブラウザーベースのフローは、リフレッシュトークンのローテーションを使用しなければなりません。これにより、SPAで安全にリフレッシュトークンが使用できる一方で、ブラウザーにあるITPなどのプライバシー保護技術にUXを阻害されることなく、エンドユーザーがリソースにシームレスにアクセスできます。
APIエンドポイントの使用方法に関するチュートリアルに従って、PKCEによる認可コードフローを使用したログイン追加PKCEによる認可コードフローを使用したAPI呼び出しが可能です。

もっと詳しく

I