Amazon Cognito での認証の仕組み - Amazon Cognito

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

Amazon Cognito での認証の仕組み

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

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

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

このトピックでは、アプリケーションが Amazon Cognito とやり取りして ID トークンで認証し、アクセストークンで認証し、ID プール認証情報 AWS のサービス でアクセスする方法について説明します。

を使用したユーザープールのAPI認証と承認 AWS SDK

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

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

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

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

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

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

  2. 「サインイン」リンクを選択します。

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

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

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

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

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

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

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

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

  11. アプリケーションは、ユーザーの をデコード、検証、保存、キャッシュしますJWTs。

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

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

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

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

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

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

ホストされた UI によるユーザープール認証

ホストされた UI は、ユーザープールとアプリケーションクライアントにリンクされたウェブサイトです。ユーザーのサインイン、サインアップ、パスワードリセット操作を実行できます。認証用のホストされた UI コンポーネントを持つアプリケーションでは、実装するデベロッパーの労力が少なくて済みます。アプリケーションは、認証用の UI コンポーネントをスキップし、ユーザーのブラウザでホストされた UI を呼び出すことができます。

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

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

ホストされた UI とサードパーティーの IdP 認証モデルは、OIDC実装に主に依存しており、スコープが 2.0 OAuth の高度な認証モデルに最適です。

次の図は、ホストされた UI 認証の一般的なサインインセッションを示しています。

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

  2. 「サインイン」リンクを選択します。

  3. アプリケーションは、ホストされた UI サインインプロンプトをユーザーに指示します。

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

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

  6. ホストされた UI は、ユーザーにMFAコードの入力を求めます。

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

  8. ホストされた UI は、ユーザーをアプリケーションにリダイレクトします。

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

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

  11. トークンエンドポイントはアプリケーションJWTsに戻ります。

  12. アプリケーションは、ユーザーの をデコード、検証、保存、キャッシュしますJWTs。

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

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

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

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

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

ホストされた UI のルックアンドフィールは、任意のアプリケーションクライアント CSSで でカスタマイズできます。また、独自の ID プロバイダー、スコープ、ユーザー属性へのアクセス、高度なセキュリティ設定を使用してアプリケーションクライアントを設定することもできます。

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

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

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

サードパーティーの IdP による認証は、ユーザーがアプリケーションにサインアップするときに新しいパスワードを思いつきたくないモデルに適合します。サードパーティー認証は、ホストされた UI 認証を実装したアプリケーションに手間をかけずに追加できます。実際には、ホストされた UI とサードパーティーは、ユーザーのブラウザで呼び出す内容のわずかなバリエーションから一貫した認証結果 IdPs を生成します。

ホストされた UI 認証と同様に、フェデレーティッド認証は 2.0 OAuth スコープの高度な認証モデルに最適です。

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

ユーザーに入力を求め、サードパーティーの 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. トークンエンドポイントはアプリケーションJWTsに戻ります。

  13. アプリケーションは、ユーザーの をデコード、検証、保存、キャッシュしますJWTs。

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

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

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

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

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

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

ID プール認証

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

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

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

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

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

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

  2. 「サインイン」リンクを選択します。

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

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

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

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

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

  8. アプリケーションは、ユーザーまたはアサーションをデコード、検証、保存JWTs、キャッシュします。

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

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

  11. ID プールは ID を返します。

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

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

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

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

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

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

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

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

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

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

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

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