Amazon Cognito による認証の仕組み - Amazon Cognito

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Cognito による認証の仕組み

顧客が Amazon Cognito ユーザープールにサインインすると、アプリケーションは JSON ウェブトークン (JWT) を受け取ります。

顧客がユーザープールトークンまたは他のプロバイダーを使用してアイデンティティプールにサインインすると、アプリケーションは一時的な AWS 認証情報を受け取ります。

ユーザープールサインインを使用すると、AWS SDK を使用して認証と認可を完全に実装できます。独自のユーザーインターフェイス (UI) コンポーネントを構築しない場合は、構築済みのウェブ UI (マネージドログイン) またはサードパーティの ID プロバイダー (IdP) のサインインページを起動できます。

このトピックでは、アプリケーションが Amazon Cognito とインタラクションを行って ID トークンでの認証、アクセストークンでの認可、アイデンティティプール認証情報での AWS のサービス へのアクセスを行う方法について説明します。

マネージドログインによるユーザープール認証

マネージドログインは、ユーザープールとアプリケーションクライアントにリンクされたウェブサイトです。ユーザーのサインイン、サインアップ、パスワードリセットの操作を実行できます。認証用のマネージドログインコンポーネントを持つアプリケーションでは、デベロッパーによる実装の労力を軽減できます。アプリケーションは、認証用の UI コンポーネントをスキップし、マネージドログインのウェブページをユーザーのブラウザで起動できます。

アプリケーションは、ウェブまたはアプリケーションのリダイレクトロケーションを使用してユーザーの JWT を収集します。マネージドログインを実装したアプリケーションは、OpenID Connect (OIDC) の IdP であるかのように、認証のためにユーザープールに接続できます。

マネージドログインは、アプリケーションが OIDC 認可サーバーの認証サービスを必要とするが、カスタム認証、アイデンティティプールの統合、ユーザー属性のセルフサービスなどの機能をすぐには必要としないモデルに適しています。これらの高度なオプションの一部を使用する場合は、SDK のユーザープールコンポーネントで実装できます。

OIDC 実装に主に依存する、マネージドログインやサードパーティ IdP の認可モデルは、OAuth 2.0 スコープを使用する高度な認可モデルに最適です。

次の図は、マネージドログイン認証の一般的なサインインセッションを示しています。

ユーザーに入力を求め、マネージドログインでユーザーをサインインさせるアプリケーションを示すフローチャート。
マネージドログイン認証フロー
  1. ユーザーがアプリケーションにアクセスします。

  2. [サインイン] リンクを選択します。

  3. アプリケーションは、ユーザープールドメインのマネージドログインページのサインインプロンプトへと、ユーザーを誘導します。

  4. ユーザー名とパスワードを入力します。

  5. ユーザープールはユーザーの認証情報を検証し、ユーザーが多要素認証 (MFA) をアクティブ化したと判断します。

  6. マネージドログインページは、MFA コードを入力するようユーザーに求めます。

  7. ユーザーが MFA コードを入力します。

  8. ユーザープールは、ユーザーをアプリケーション URL にリダイレクトします。

  9. アプリケーションは、マネージドログインでコールバック URL に追加した URL リクエストパラメータから認証コードを収集します。

  10. アプリケーションは、認証コードを使用してトークンをリクエストします。

  11. トークンエンドポイントは JWT をアプリケーションに返します。

  12. アプリケーションは、ユーザーの JWT についてデコード、検証、保存、キャッシングを行います。

  13. アプリケーションには、リクエストの対象である、アクセスコントロールコンポーネントが表示されます。

  14. ユーザーはコンテンツを表示します。

  15. その後、ユーザーのアクセストークンの有効期限が切れ、アクセスコントロールコンポーネントの表示をリクエストします。

  16. アプリケーションは、ユーザーのセッションを持続させる必要があると判断します。更新トークンを使用して、トークンエンドポイントから新しいトークンをリクエストします。

バリアントとカスタマイズ

ブランディングエディタを使用して、ユーザープール全体または任意のアプリケーションクライアントレベルで、マネージドログインページの外観と操作感をカスタマイズできます。また、独自の ID プロバイダー、スコープ、ユーザー属性へのアクセス、高度なセキュリティ設定を使用してアプリケーションクライアントを設定することもできます。

AWS SDK によるユーザープール API の認証と認可

AWS は、Amazon Cognito ユーザープール、または Amazon Cognito ID プロバイダーのコンポーネントを、さまざまなデベロッパーフレームワークで開発しました。これらの SDK に組み込まれているメソッドは、Amazon Cognito ユーザープール API を呼び出します。同じユーザープール API 名前空間には、ユーザープールの設定とユーザー認証のためのオペレーションがあります。詳細については、「API、OIDC、マネージドログインページの認証についての理解」を参照してください。

API 認証は、アプリケーションに既存の UI コンポーネントがあって、かつ、主にユーザーディレクトリとしてユーザープールに依存するモデルに適合します。この設計では、Amazon Cognito を大型アプリケーション内のコンポーネントとして追加します。これには、複雑なチャレンジとレスポンスの連鎖を処理するためのプログラムロジックが必要です。

このアプリケーションでは、OpenID Connect (OIDC) の依拠しているパーティーによる完全な実装を実装する必要はありません。代わりに、JWT をデコードして使用できます。ローカルユーザーのユーザープール機能一式にアクセスするには、開発環境で Amazon Cognito SDK を使用して認証を構築します。

カスタム OAuth スコープを使用した API 認証は、外部 API 認証に向いていません。API 認証からアクセストークンにカスタムスコープを追加するには、トークン生成前の Lambda トリガー を使用して実行時にトークンを変更します。

次の図は、API 認証の一般的なサインインセッションを示しています。

ユーザーに入力を求め、AWS SDK でサインインするアプリケーションを示すフローチャート。
API 認証フロー
  1. ユーザーがアプリケーションにアクセスします。

  2. [サインイン] リンクを選択します。

  3. ユーザー名とパスワードを入力します。

  4. アプリケーションは、InitiateAuth リクエストを行うメソッドを呼び出します。リクエストはユーザーの認証情報をユーザープールに渡します。

  5. ユーザープールはユーザーの認証情報を検証し、ユーザーが多要素認証 (MFA) をアクティブ化したと判断します。

  6. ユーザープールは、MFA コードをリクエストするチャレンジで応答します。

  7. アプリケーションは、ユーザーから MFA コードを収集するプロンプトを生成します。

  8. アプリケーションは、RespondToAuthChallenge API リクエストを行うメソッドを呼び出します。リクエストはユーザーの MFA コードを渡します。

  9. ユーザープールは、ユーザーの MFA コードを検証します。

  10. ユーザープールは、ユーザーの JWT で応答します。

  11. アプリケーションは、ユーザーの JWT についてデコード、検証、保存、キャッシングを行います。

  12. アプリケーションには、リクエストの対象である、アクセスコントロールコンポーネントが表示されます。

  13. ユーザーはコンテンツを表示します。

  14. その後、ユーザーのアクセストークンの有効期限が切れ、アクセスコントロールコンポーネントの表示をリクエストします。

  15. アプリケーションは、ユーザーのセッションを持続させる必要があると判断します。更新トークンを使用して InitiateAuth メソッドを再度呼び出し、新しいトークンを取得します。

バリアントとカスタマイズ

このフローは、独自のカスタム認証チャレンジなど、追加のチャレンジで拡張できます。パスワードが漏洩したユーザー、または予期しないサインイン特性によって悪意のあるサインインの試みがなされたことを示している可能性があるユーザーのアクセスを自動的に制限できます。このフローは、オペレーションがサインアップ、ユーザー属性の更新、パスワードのリセットを行う場合とほぼ同じです。これらのフローのほとんどには、パブリック (クライアント側) と機密 (サーバー側) の API オペレーションが重複しています。

サードパーティー ID プロバイダーによるユーザープール認証

外部 ID プロバイダー (IdP) によるサインイン (またはフェデレーション認証) は、マネージドログインと似たモデルです。アプリケーションはユーザープールへの OIDC 依拠している当事者であり、ユーザープールは IdP へのパススルーとして機能します。IdP は、Facebook や Google などのコンシューマーユーザーディレクトリにすることも、SAML 2.0 や Azure などの OIDC エンタープライズディレクトリにすることもできます。

アプリケーションは、ユーザーのブラウザでマネージドログインを呼び出す代わりに、ユーザープールの認可サーバーでリダイレクトエンドポイントを呼び出します。ユーザーのビューから、アプリケーションのサインインボタンを選択します。次に、IdP からサインインするよう求められます。マネージドログイン認証と同じように、アプリケーションはアプリ内のリダイレクト場所で JWT を収集します。

サードパーティー IdP による認証は、アプリケーションにサインアップするときにユーザーが新しいパスワードを作らないモデルに適合します。サードパーティ認証は、マネージドログイン認証を実装したアプリケーションに簡単に追加できます。実際、マネージドログインとサードパーティ IdP は、ユーザーのブラウザで何を呼び出すかのわずかな違いに基づいて、一貫した認証結果を生成します。

マネージドログイン認証と同様に、フェデレーション認証は、OAuth 2.0 スコープを使用する高度な認可モデルに最適です。

次の図は、フェデレーション認証の一般的なサインインセッションを示しています。

ユーザーに入力を求め、サードパーティー IdP でサインインするアプリケーションを示すフローチャート。
フェデレーション認証フロー
  1. ユーザーがアプリケーションにアクセスします。

  2. [サインイン] リンクを選択します。

  3. アプリケーションは、IdP を使用してサインインプロンプトをユーザーに指示します。

  4. ユーザー名とパスワードを入力します。

  5. IdP はユーザーの認証情報を検証し、ユーザーが多要素認証 (MFA) をアクティブ化したと判断します。

  6. IdP は、ユーザーに MFA コードを入力するように求めます。

  7. ユーザーが MFA コードを入力します。

  8. IdP は、SAML レスポンスまたは認証コードを使用してユーザーをユーザープールにリダイレクトします。

  9. ユーザーが認証コードを渡した場合、ユーザープールはコードを IdP トークンにサイレント交換します。ユーザープールは IdP トークンを検証し、新しい認証コードを使用してユーザーをアプリケーションにリダイレクトします。

  10. アプリケーションは、コールバック URL にユーザープールが追加した URL リクエストパラメータから認証コードを収集します。

  11. アプリケーションは、認証コードを使用してトークンをリクエストします。

  12. トークンエンドポイントは JWT をアプリケーションに返します。

  13. アプリケーションは、ユーザーの JWT についてデコード、検証、保存、キャッシングを行います。

  14. アプリケーションには、リクエストの対象である、アクセスコントロールコンポーネントが表示されます。

  15. ユーザーはコンテンツを表示します。

  16. その後、ユーザーのアクセストークンの有効期限が切れ、アクセスコントロールコンポーネントの表示をリクエストします。

  17. アプリケーションは、ユーザーのセッションを持続させる必要があると判断します。更新トークンを使用して、トークンエンドポイントから新しいトークンをリクエストします。

バリアントとカスタマイズ

マネージドログインでフェデレーション認証を開始できます。ここで、ユーザーは、アプリケーションクライアントに割り当てられたリストから IdP を選択できます。マネージドログインは、E メールアドレスを入力するよう求め、対応する SAML IdP にユーザーのリクエストを自動的にルーティングすることもできます。サードパーティ ID プロバイダーによる認証では、マネージドログインとのユーザーインタラクションは必要ありません。アプリケーションは、ユーザーの認可サーバーリクエストにリクエストパラメータを追加し、ユーザーに IdP サインインページにサイレントリダイレクトさせることができます。

アイデンティティプール認証

アイデンティティプールは、関数、API 名前空間、および SDK モデルのユーザープールとは異なる、アプリケーションのコンポーネントです。ユーザープールがトークンベースの認証と認可を提供する場合、アイデンティティプールは AWS Identity and Access Management (IAM) の認可を提供します。

アイデンティティプールに IdP のセットを割り当て、それを使用してユーザーにサインインできます。ユーザープールはアイデンティティプール IdP として緊密に統合されており、アイデンティティプールに対して、アクセスコントロールの大半のオプションを提供します。同時に、アイデンティティプールにはさまざまな認証オプションがあります。ユーザープールは、アイデンティティプールからの一時的な AWS 認証情報へのルートとして、SAML、OIDC、ソーシャル、デベロッパー、ゲスト ID ソースに参加します。

アイデンティティプールによる認証は外部です。以前に説明したユーザープールフローのいずれかに従うか、別の IdP で独自に開発するフローに従います。アプリケーションが初期認証を実行すると、検証をアイデンティティプールに渡して、その見返りとして一時的なセッションを受け取ります。

アイデンティティプールによる認証は、IAM 認証を使用して AWS のサービス 内のアプリケーションアセットとデータのアクセスコントロールを適用するモデルに適合します。ユーザープールの API 認証と同様に、成功したアプリケーションには、ユーザーの利益のためにアクセスする各サービスの AWS SDK が含まれます。AWSSDK は、アイデンティティプール認証の認証情報を API リクエストの署名として適用します。

次の図は、IdP によるアイデンティティプール認証の一般的なサインインセッションを示しています。

ユーザーに入力を求め、サードパーティー IdP でサインインするアプリケーションを示すフローチャート。
アイデンティティプールの認証フロー
  1. ユーザーがアプリケーションにアクセスします。

  2. [サインイン] リンクを選択します。

  3. アプリケーションは、IdP を使用してサインインプロンプトをユーザーに指示します。

  4. ユーザー名とパスワードを入力します。

  5. IdP はユーザーの認証情報を検証します。

  6. IdP は、SAML レスポンスまたは認証コードを使用してユーザーをアプリケーションにリダイレクトします。

  7. ユーザーが認証コードを渡した場合、アプリケーションはコードを IdP トークンと交換します。

  8. アプリケーションは、ユーザーの JWT またはアサーションについてデコード、検証、保存、キャッシングを行います。

  9. アプリケーションは GetId API リクエストを行うメソッドを呼び出します。ユーザーのトークンまたはアサーションを渡し、アイデンティティ ID をリクエストします。

  10. アイデンティティプールは、設定された ID プロバイダーに対してトークンまたはアサーションを検証します。

  11. アイデンティティプールはアイデンティティ ID を返します。

  12. アプリケーションは、GetCredentialsForIdentity API リクエストを行うメソッドを呼び出します。ユーザーのトークンまたはアサーションを渡し、IAM ロールをリクエストします。

  13. アイデンティティプールは新しい JWT を生成します。新しい JWT には、IAM ロールをリクエストするクレームが含まれています。アイデンティティプールは、ユーザーのリクエストと、IdP のアイデンティティプール設定のロール選択基準に基づいてロールを決定します。

  14. AWS Security Token Service (AWS STS) は、アイデンティティプールからの AssumeRoleWithWebIdentity リクエストに応答します。レスポンスには、IAM ロールを持つ一時的セッションの API 認証情報が含まれています。

  15. アプリケーションはセッション認証情報を保存します。

  16. ユーザーは、AWS でアクセス保護されたリソースを必要とするアクションをアプリケーションで実行します。

  17. アプリケーションは、必要な AWS のサービス の API リクエストに、署名として一時的な認証情報を適用します。

  18. IAM は、認証情報のロールにアタッチされたポリシーを評価します。それらをリクエストと比較します。

  19. AWS のサービス は、リクエストされたデータを返します。

  20. アプリケーションは、ユーザーのインターフェイスにデータをレンダリングします。

  21. ユーザーはデータを表示します。

バリアントとカスタマイズ

ユーザープールによる認証を視覚化するには、問題トークン/アサーションステップの後に、以前のユーザープールの概要のいずれかを挿入します。デベロッパー認証は、ID のリクエスト前のすべてのステップを、デベロッパー認証情報によって署名されたリクエストに置き換えます。また、ゲスト認証は ID のリクエストに直接スキップし、認証を検証せず、アクセスが制限された IAM ロールの認証情報を返します。