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で拡張された認可コードフローは標準の認可コードフローに基づいているため、手順は非常に似ています。

ユーザーがアプリケーション内で[Login(ログイン)]をクリックします
Auth0のSDKは暗号的にランダムな
code_verifier
を作成し、そこからcode_challenge
を生成します。Auth0のSDKは
code_challenge
とともにユーザーをAuth0の認証サーバー(/authorize
エンドポイント)にリダイレクトします。Auth0の認可サーバーがユーザーをログインにリダイレクトして、認可を促します。
ユーザーが構成されたログインオプションの1つを使用して認証を行い、Auth0がアプリケーションに付与する許可をリストした同意ページが表示されることもあります。
Auth0の認可サーバーは
code_challenge
を保存し、1回限り使用できる認可コード
でユーザーをアプリケーションにリダイレクトします。Auth0のSDKは、この
コード
とcode_verifier
(手順2で作成)をAuth0の認可サーバー(
/oauth/token
エンドポイント)に送信します。Auth0の認可サーバーは
code_challenge
とcode_verifier
を検証します。Auth0の認可サーバーが、IDトークンとアクセストークン(リフレッシュトークンは任意)で応答します。
アプリケーションがアクセストークンを使ってAPIを呼び出し、ユーザーについての情報にアクセスします。
APIが要求データで応答します。
実装方法
PKCEで認可コードフローを最も簡単に実装するには、「ネイティブクイックスタート」または「シングルページクイックスタート」に従うことです。
アプリケーションタイプによっては、モバイルやシングルページアプリのSDKを使用することもできます。
モバイル
シングルページアプリ
APIエンドポイントの使用方法に関するチュートリアルに従って、PKCEによる認可コードフローを使用したログイン追加、PKCEによる認可コードフローを使用したAPI呼び出しが可能です。