Proof Key for Code Exchange(PKCE)を使った認可コードフロー

Overview

重要なコンセプト

  • OAuth 2.0の付与タイプ、Proof Key for Code Exchange(PKCE)での認可コードフローの詳細を確認する

  • ネイティブアプリやシングルページアプリなど、クライアントシークレットを保管できないアプリケーションにこの付与タイプを使用する

  • Auth0 SDKを使った各種の実装方法を確認する

パブリッククライアント(例:ネイティブおよびシングルページアプリケーション)がアクセストークンを要求した際に、認可コードフローだけでは軽減しきれないセキュリティ上の懸念が提起されていました。これは以下の理由によるものです。

ネイティブアプリ

  • アプリが クライアントシークレットを安全に保管できません。アプリを逆コンパイルすると、クライアントシークレットが暴露されます。クライアントシークレットはアプリにバインドされるものであり、すべてのユーザーとデバイスについても同様です。

  • カスタムURLスキームを利用して、リダイレクト(「MyApp://」など)をキャプチャできる可能性があるため、悪意のあるアプリケーションが 認可コード認可サーバーから取得できる可能性があります。

シングルページアプリ

  • ブラウザーがソース全体を使用できるため、クライアントシークレットを安全に保管できません。

これらの状況を踏まえて、OAuth 2.0は認可コードフローに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が要求データで応答します。

実装方法

PKCEで認可コードフローを最も簡単に実装するには、「ネイティブクイックスタート」または「シングルページクイックスタート」に従うことです。

アプリケーションタイプによっては、モバイルやシングルページアプリのSDKを使用することもできます。

モバイル

シングルページアプリ

APIエンドポイントの使用方法に関するチュートリアルに従って、PKCEによる認可コードフローを使用したログイン追加PKCEによる認可コードフローを使用したAPI呼び出しが可能です。

もっと詳しく