OIDC ユーザープール IdP 認証フロー - Amazon Cognito

OIDC ユーザープール IdP 認証フロー

OpenID Connect (OIDC) サインインを使用すると、ユーザープールは ID プロバイダー (IdP) による認可コードサインインフローを自動化します。ユーザーが IdP でサインインを完了すると、Amazon Cognito は外部プロバイダーの oauth2/idpresponse エンドポイントでコードを収集します。結果として得られたアクセストークンを使用して、ユーザープールは、IdP userInfo エンドポイントにクエリを実行してユーザー属性を取得します。その後、ユーザープールは、受信した属性を、設定済みの属性マッピングルールと比較し、それに応じてユーザーのプロファイルと ID トークンを入力します。

OIDC プロバイダー設定でリクエストする OAuth 2.0 スコープは、IdP が Amazon Cognito に提供するユーザー属性を定義します。セキュリティのベストプラクティスとしては、ユーザープールにマッピングする属性に対応するスコープのみをリクエストします。例えば、ユーザープールが openid profile をリクエストすると、考えられる属性がすべて取得されますが、openid email phone_number をリクエストすると、ユーザーの E メールアドレスと電話番号のみが取得されます。OIDC IdP にリクエストするスコープについては、アプリケーションクライアントとユーザープール認証リクエストで認可とリクエストを行うスコープとは異なるものとして設定できます。

ユーザーが OIDC IdP を使用してアプリケーションにサインインする場合、ユーザープールは、以下の認証フローはを実行します。

  1. ユーザーが Amazon Cognito の組み込みサインインページにアクセスすると、Salesforce などの OIDC IdP 経由でサインインするオプションが提示されます。

  2. ユーザーは、OIDC IdP の authorization エンドポイントにリダイレクトされます。

  3. ユーザーが認証を行うと、OIDC IdP が認可コードを使用して Amazon Cognito にリダイレクトします。

  4. Amazon Cognito が OIDC IdP の認可コードをアクセストークンと交換します。

  5. Amazon Cognito がユーザープールのユーザーアカウントを作成または更新します。

  6. Amazon Cognito がアプリケーションのベアラートークンを発行します。これには ID トークン、アクセストークン、および更新トークンが含まれる場合があります。

OIDC ユーザープール IdP 認証フロー
注記

Amazon Cognito は 5 分以内に完了しない認証リクエストをキャンセルし、ホストされた UI にユーザーをリダイレクトします。ページには、Something went wrong というエラーメッセージが表示されます。

OIDC は、OAuth 2.0 の上に位置する ID レイヤーです。OAuth 2.0 は、IdP から OIDC クライアントアプリ (証明書利用者) に発行される JSON 形式 (JWT) の ID トークンを指定します。Amazon Cognito の OIDC Relying Party としての追加に関する情報は、OIDC IdP のドキュメントを参照してください。

ユーザーが認可コード付与を使用して認証すると、ユーザープールは ID、アクセス、更新トークンを返します。ID トークンは ID 管理用の OIDC 標準トークンです。アクセストークンは OAuth 2.0 標準トークンです。ユーザープールのアプリケーションクライアントがサポートできる付与タイプの詳細については、「認可エンドポイント」を参照してください。

ユーザープールが OIDC プロバイダーからのクレームを処理する方法

ユーザーがサードパーティーの OIDC プロバイダーへのサインインを完了すると、Amazon Cognito がホストする UI は IdP から認可コードを取得します。ユーザープールは、アクセストークンと ID トークンの認可コードを IdP の token エンドポイントと交換します。ユーザープールはこれらのトークンをユーザーやアプリに渡すのではなく、これらを使って独自のトークンのクレームで提示するデータを使用してユーザープロファイルを構築します。

Amazon Cognito はアクセストークンを個別に検証しません。代わりに、userInfoプロバイダーの エンドポイントにユーザー属性情報をリクエストし、トークンが有効でない場合はリクエストが拒否されることを想定しています。

Amazon Cognito は、以下のチェックを行ってプロバイダー ID トークンを検証します。

  1. プロバイダーが RSA、HMAC、Elliptic Curve というセットのアルゴリズムを使用してトークンに署名したことをチェックします。

  2. プロバイダーが非対称署名アルゴリズムを使用してトークンに署名した場合は、トークンの kid クレームの署名キー ID がプロバイダーの jwks_uri エンドポイントに表示されていることを確認します。

  3. ID トークンの署名を、プロバイダーのメタデータに基づいて想定される署名と比較します。

  4. iss クレームを IdP に設定された OIDC 発行者と比較します。

  5. aud クレームが IdP で設定されているクライアント ID と一致するか、または aud クレームに複数の値がある場合は設定されたクライアント ID が含まれているかを比較します。

  6. exp クレームのタイムスタンプが現在の時刻より前でないことをチェックします。

ユーザープールは ID トークンを検証し、プロバイダーアクセストークンを使用してプロバイダーの userInfo エンドポイントへのリクエストを試みます。アクセストークンのスコープによって読み取りが許可されたユーザープロファイル情報がすべて取得されます。次にユーザープールはユーザープールの要求に従って設定したユーザー属性を検索します。プロバイダー設定で、必要な属性の属性マッピングを作成する必要があります。ユーザープールはプロバイダー ID トークンと userInfo レスポンスをチェックします。ユーザープールは、マッピングルールに一致するすべてのクレームをユーザープールのユーザープロファイルのユーザー属性に書き込みます。ユーザープールは、マッピングルールに一致するが必須ではなく、プロバイダーのクレームにも含まれていない属性を無視します。