Amazon Cognito ユーザープールによる認証 - Amazon Cognito

Amazon Cognito ユーザープールによる認証

Amazon Cognito には、ユーザーを認証する方法がいくつか用意されています。ユーザーは、パスワードと WebAuthn パスキーを使用してサインインできます。Amazon Cognito は、E メールまたは SMS メッセージでワンタイムパスワードを送信できます。独自のチャレンジとレスポンスのシーケンスを調整する Lambda 関数を実装できます。これらは認証フローです。認証フローでは、ユーザーがシークレットを提供します。Amazon Cognito がシークレットを検証して JSON ウェブトークン (JWT) を発行し、これをアプリケーションが OIDC ライブラリで処理します。この章では、さまざまなアプリケーション環境でさまざまな認証フロー用にユーザープールとアプリケーションクライアントを設定する方法について説明します。マネージドログインのホストされたサインインページを使用するオプションと、AWS SDK で独自のロジックとフロントエンドを構築するためのオプションについて説明します。

ドメインの有無にかかわらず、すべてのユーザープールはユーザープール API でユーザーを認証できます。ユーザープールにドメインを追加すると、ユーザープール エンドポイントを使用できます。ユーザープール API は、API リクエストのさまざまな認可モデルとリクエストフローをサポートします。

ユーザーのアイデンティティを検証するために、Amazon Cognito では、E メールや SMS メッセージのワンタイムパスワードやパスキーなどのパスワードに加えて、チャレンジタイプを組み込んだ認証フローをサポートしています。

認証フローを実装する

認証のためにマネージドログインを実装するか、カスタム構築アプリケーションフロントエンドを AWS SDK で実装するかにかかわらず、実装する認証のタイプに合わせてアプリケーションクライアントを設定する必要があります。以下の情報では、アプリケーションクライアントとアプリケーションにおける認証フローの設定について説明します。

App client supported flows

アプリケーションクライアントがサポートするフローは、Amazon Cognito コンソールまたは AWS SDK の API を使用して設定できます。これらのフローをサポートするようにアプリケーションクライアントを設定した後で、アプリケーションにデプロイできます。

次の手順では、Amazon Cognito コンソールを使用してアプリケーションクライアントで利用できる認証フローを設定します。

認証フロー用にアプリケーションクライアントを設定するには (コンソール)
  1. AWS にサインインし、Amazon Cognito ユーザープールコンソールに移動します。ユーザープールを選択するか、新しいユーザープールを作成します。

  2. ユーザープールの設定で、[アプリケーションクライアント] メニューを選択します。アプリケーションクライアントを選択するか、新しく作成します。

  3. [アプリケーションクライアントに関する情報] で、[編集] を選択します。

  4. [アプリケーションクライアントのフロー] で、サポートする認証フローを選択します。

認証フロー用にアプリケーションクライアントを設定するには (API/SDK)

Amazon Cognito API を使用してアプリケーションクライアントで利用可能な認証フローを設定するには、CreateUserPoolClient リクエストまたは UpdateUserPoolClient リクエストで ExplicitAuthFlows の値を設定します。次の例では、セキュアリモートパスワード (SRP) と選択ベースの認証をクライアントにプロビジョニングします。

"ExplicitAuthFlows": [ "ALLOW_USER_AUTH", "ALLOW_USER_SRP_AUTH ]

アプリケーションクライアントがサポートするフローを設定するときは、以下のオプションと API 値を指定できます。

アプリケーションクライアントでのフローのサポート
認証フロー 互換性 コンソール API
選択ベースの認証 サーバー側、クライアント側 サインイン時に認証タイプを選択する ALLOW_USER_AUTH
永続的なパスワードによるサインイン クライアント側 ユーザー名とパスワードでサインインする ALLOW_USER_PASSWORD_AUTH
永続的なパスワードと安全なペイロードによるサインイン サーバー側、クライアント側 セキュアリモートパスワード (SRP) でサインインする ALLOW_USER_SRP_AUTH
更新トークン サーバー側、クライアント側 既存の認証済みセッションから新しいユーザートークンを取得する ALLOW_REFRESH_TOKEN_AUTH
サーバー側の認証 サーバー側 サーバー側の管理認証情報でサインインする ALLOW_ADMIN_USER_PASSWORD_AUTH
カスタム認証 サーバー側およびクライアント側のカスタム構築アプリケーション。マネージドログインとの互換性なし。 Lambda トリガーからのカスタム認証フローでサインインする ALLOW_CUSTOM_AUTH
Implement flows in your application

マネージドログインでは、設定した認証オプションが、サインインページで自動的に利用可能になります。カスタム構築アプリケーションでは、初期フローの宣言から認証を開始します。

  • ユーザーのフローオプションのリストから選択するには、USER_AUTH フローで選択ベースの認証を宣言します。このフローでは、パスキー認証やパスワードなしの認証など、クライアントベースの認証フローでは利用できない認証方法を利用できます。

  • 認証フローを事前に選択するには、アプリケーションクライアントで利用可能な他のフローでクライアントベースの認証を宣言します。

ユーザーをサインインさせるときは、InitiateAuth リクエストまたは AdminInitiateAuth リクエストの本文に AuthFlow パラメータを含める必要があります。

選択ベースの認証:

"AuthFlow": "USER_AUTH"

SRP によるクライアントベースの認証:

"AuthFlow": "USER_SRP_AUTH"

ユーザープールによる認証について知っておくべきこと

Amazon Cognito ユーザープールを使用した認証モデルの設計では、以下の情報を考慮してください。

マネージドログインとホストされた UI の認証フロー

マネージドログインには、クラシックのホストされた UI よりも多くの認証オプションがあります。例えば、ユーザーはマネージドログインでのみ、パスワードなしの認証とパスキー認証を実行できます。

AWS SDK 認証でのみ利用可能なカスタム認証フロー

マネージドログインまたはクラシックのホストされた UI で、カスタム認証フローLambda トリガーによるカスタム認証を行うことはできません。カスタム認証は AWS SDK による認証で利用できます。

外部 ID プロバイダー (IdP) によるサインイン用のマネージドログイン

AWS SDK による認証では、サードパーティの IdP を介してユーザーをサインインさせることはできません。マネージドログインまたはクラシックのホストされた UI を実装し、IdP にリダイレクトしてから、結果の認証オブジェクトをアプリケーション内の OIDC ライブラリで処理する必要があります。マネージドログインの詳細については、「ユーザープールのマネージドログイン」を参照してください。

パスワードなしの認証が他のユーザー機能に与える影響

ユーザープールとアプリケーションクライアントでワンタイムパスワードまたはパスキーを使用してパスワードなしのサインインをアクティブ化すると、ユーザーの作成と移行に影響します。パスワードなしのサインインがアクティブな場合:

  1. 管理者はパスワードなしでユーザーを作成できます。デフォルトの招待メッセージテンプレートが変わり、{###} パスワードプレースホルダーを含まないようになります。詳細については、「管理者としてのユーザーアカウントの作成」を参照してください。

  2. SDK ベースのSignUp オペレーションの場合、ユーザーはサインアップ時にパスワードを入力する必要はありません。マネージドログインとホストされた UI では、パスワードなしの認証が許可されている場合でも、サインアップページでパスワードが必要です。詳細については、「ユーザーアカウントのサインアップと確認」を参照してください。

  3. CSV ファイルからインポートされたユーザーは、ユーザーの属性に、パスワードなしのサインインオプションに利用できる E メールアドレスまたは電話番号が含まれている場合、パスワードをリセットせずに、パスワードなしのオプションで即座にサインインできます。詳細については、「CSV ファイルからユーザープールへのユーザーのインポート」を参照してください。

  4. パスワードなしの認証では、ユーザー移行の Lambda トリガーは呼び出されません。

  5. パスワードなしの最初の要素でサインインしたユーザーは、セッションに多要素認証 (MFA) 要素を追加できません。MFA は、パスワードベースの認証フローでのみサポートされます。

パスキーに依拠しているパーティの URL をパブリックサフィックスリストに含めることはできない

所有しているドメイン名 (www.example.com など) を、パスキー設定で依拠しているパーティ (RP) の ID として使用できます。この設定は、所有しているドメインで実行するカスタム構築アプリケーションをサポートすることを目的としています。パブリックサフィックスリスト (PSL) には、保護された高レベルのドメインが含まれています。PSL のドメインに RP URL を設定しようとすると、Amazon Cognito はエラーを返します。

認証フローセッションの持続期間

ユーザープールの機能によっては、アプリケーションが Amazon Cognito からトークンを取得する前に、InitiateAuthRespondToAuthChallenge へのいくつかのチャレンジに応答することが必要になる場合があります。Amazon Cognito は、各リクエストへの応答にセッション文字列を含めます。API リクエストを 1 つの認証フローにまとめるには、前のリクエストに対する応答のセッション文字列を、後続の各リクエストに含めます。デフォルトでは、セッション文字列が期限切れになる前に、ユーザーに各チャレンジを完了するまでに 3 分間が与えられます。この期間を調整するには、アプリケーションクライアントの認証フローセッション持続期間を変更します。次の手順では、アプリクライアントの構成で、この設定を変更する方法について説明します。

注記

[認証フローセッションの持続期間] の設定は、Amazon Cognito ユーザープール API による認証に適用されます。マネージドログインの場合、多要素認証にはセッション時間が 3 分、パスワードリセットコードには 8 分が設定されます。

Amazon Cognito console
アプリクライアントの認証フローセッション持続期間を設定するには (AWS マネジメントコンソール)
  1. ユーザープールの [App integration] (アプリの統合) タブで、[App clients and analytics] (アプリクライアントと分析) コンテナからアプリクライアントの名前を選択します。

  2. [アプリケーションクライアントに関する情報] コンテナで [編集] を選択します。

  3. [認証フローセッションの持続期間] の値を、SMS および E メールの MFA コードに必要な有効期間 (分単位) に変更します。これにより、ユーザーがアプリクライアントで認証チャレンジを完了するまでの時間も変更されます。

  4. [Save changes] (変更の保存) をクリックします。

User pools API
アプリクライアントの認証フローセッション持続期間を設定するには (Amazon Cognito API)
  1. DescribeUserPoolClient リクエストから既存のユーザープール設定を使用して UpdateUserPoolClient リクエストを準備します。UpdateUserPoolClient リクエストには、既存のアプリクライアントのプロパティをすべて含める必要があります。

  2. AuthSessionValidity の値を、SMS MFA コードに必要な有効持続期間 (分単位) に変更します。これにより、ユーザーがアプリクライアントで認証チャレンジを完了するまでの時間も変更されます。

アプリクライアントの詳細については、「アプリケーションクライアントによるアプリケーション固有の設定」を参照してください。

サインイン試行の失敗時におけるロックアウト動作

ユーザーのパスワードによるサインイン試行が 5 回失敗すると、認証されていない API オペレーションと IAM で認可された API オペレーションのどちらでリクエストしたかにかかわらず、Amazon Cognito はユーザーを 1 秒間ロックアウトします。ロックアウトの期間は、試行が 1 回失敗するたびに 2 倍になり、最大で約 15 分になります。

ロックアウト期間中に試行すると Password attempts exceeded 例外が生成され、その後のロックアウト期間の長さには影響しません。サインイン試行の累積失敗回数が n (Password attempts exceeded 例外を含まない) に達すると、Amazon Cognito はユーザーを 2^(n-5) 秒間ロックアウトします。ロックアウトを n=0 初期状態にリセットするには、ユーザーは、ロックアウト期間後にサインインに成功するか、連続 15 分間、サインイン試行を開始してはなりません。この動作は変更される可能性があります。この動作は、パスワードベースの認証も実行しない限り、カスタムチャレンジに適用されません。

認証セッションの例

次の図とステップバイステップガイドは、ユーザーがアプリケーションにサインインする一般的なシナリオを示しています。サンプルアプリケーションでは、いくつかのサインインオプションをユーザーに示します。ユーザーは認証情報を入力してオプションを 1 つ選択し、追加の認証要素を指定してサインインします。

ユーザーに入力を求め、AWS SDK でサインインするアプリケーションを示すフローチャート。

ユーザーがユーザー名とパスワードでサインインしたり、E メールメッセージでワンタイムコードをリクエストしたり、フィンガープリントオプションを選択したりできるサインインページを備えたアプリケーションを想像してください。

  1. サインインプロンプト: アプリケーションは、[ログイン] ボタンがあるホーム画面を表示します。

  2. サインインのリクエスト: ユーザーは [ログイン] を選択します。アプリケーションは、Cookie またはキャッシュからユーザー名を取得するか、ユーザー名の入力をユーザーに求めます。

  3. リクエストオプション: アプリケーションは、USER_AUTH フローの InitiateAuth API リクエストでユーザーのサインインオプションをリクエストし、ユーザーが利用できるサインイン方法を求めます。

  4. サインインオプションの送信: Amazon Cognito は、PASSWORDEMAIL_OTPWEB_AUTHN で応答します。応答には、次回の応答で再生するためのセッション識別子が含まれます。

  5. 表示オプション: アプリケーションは、ユーザーがユーザー名とパスワードの入力、ワンタイムコードの取得、フィンガープリントのスキャンを行うための UI 要素を表示します。

  6. オプションの選択/認証情報の入力: ユーザーはユーザー名とパスワードを入力します。

  7. 認証の開始: アプリケーションは、ユーザー名パスワードによるサインインを確認してユーザー名とパスワードを提供する RespondToAuthChallenge API リクエストにより、ユーザーのサインイン情報を提供します。

  8. 認証情報の検証: Amazon Cognito はユーザーの認証情報を確認します。

  9. 追加のチャレンジ: ユーザーは、Authenticator アプリケーションで多要素認証を設定しています。Amazon Cognito は SOFTWARE_TOKEN_MFA チャレンジを返します。

  10. チャレンジプロンプト: アプリケーションは、ユーザーの Authenticator アプリケーションから時間ベースのワンタイムパスワード (TOTP) をリクエストするフォームを表示します。

  11. チャレンジへの回答: ユーザーは TOTP を送信します。

  12. チャレンジへの応答: 別の RespondToAuthChallenge リクエストで、アプリケーションはユーザーの TOTP を提供します。

  13. チャレンジレスポンスの検証: Amazon Cognito はユーザーのコードを確認し、ユーザープールが現在のユーザーに追加のチャレンジを発行しないように設定されていることを検証します。

  14. トークンの発行: Amazon Cognito は ID、アクセス、JSON ウェブトークン (JWT) の更新を返します。ユーザーの初期認証がここで完了します。

  15. トークンの保存: アプリケーションはユーザーのトークンをキャッシュして、ユーザーデータの参照、リソースへのアクセスの許可、有効期限切れトークンの更新ができるようにします。

  16. 認可されたコンテンツのレンダリング: アプリケーションは、ユーザーのアイデンティティとロールに基づいて、リソースへのユーザーのアクセス権を決定し、アプリケーションコンテンツを配信します。

  17. コンテンツへのアクセス: ユーザーはサインインし、アプリケーションの使用を開始します。

  18. 期限切れトークンによるコンテンツのリクエスト: 後で、ユーザーは認可を必要とするリソースをリクエストします。ユーザーのキャッシュされたトークンの有効期限が切れています。

  19. 更新トークン: アプリケーションは、ユーザーの保存された更新トークンを使用して InitiateAuth リクエストを行います。

  20. トークンの発行: Amazon Cognito は新しい ID とアクセス用の JWT を返します。ユーザーのセッションは、追加の認証情報の入力を求められることなく、安全に更新されます。

AWS Lambda トリガーを使用して、ユーザーの認証方法をカスタマイズできます。トリガーは独自のチャレンジを認証フローの一部として発行し検証を行います。

また、安全なバックエンドサーバーでは、管理者の認証フローを使用することもできます。ユーザー移行の認証フローを使用すると、ユーザーにパスワードのリセットを要求することなく、ユーザーを移行できます。