

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

# Amazon Cognito ユーザープールによる認証
<a name="authentication"></a>

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

ドメインの有無にかかわらず、すべてのユーザープールはユーザープール API でユーザーを認証できます。ユーザープールにドメインを追加すると、[ユーザープール エンドポイント](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)を使用できます。ユーザープール API は、API リクエストのさまざまな認可モデルとリクエストフローをサポートします。

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

**Topics**
+ [認証フローを実装する](#authentication-implement)
+ [ユーザープールによる認証について知っておくべきこと](#authentication-flow-things-to-know)
+ [認証セッションの例](#amazon-cognito-user-pools-authentication-flow)
+ [マネージドログインの認証方法を設定する](authentication-flows-selection-managedlogin.md)
+ [AWS SDKsで認証方法を管理する](authentication-flows-selection-sdk.md)
+ [認証フロー](amazon-cognito-user-pools-authentication-flow-methods.md)
+ [API 認証と SDK 認証の認可モデル](authentication-flows-public-server-side.md)

## 認証フローを実装する
<a name="authentication-implement"></a>

[マネージドログイン](authentication-flows-selection-managedlogin.md)を実装するか、認証用の AWS SDK [を使用してカスタム構築されたアプリケーションフロントエンド](authentication-flows-selection-sdk.md)を実装するかにかかわらず、実装する認証のタイプに合わせてアプリケーションクライアントを設定する必要があります。以下の情報では、[アプリケーションクライアント](user-pool-settings-client-apps.md)とアプリケーションにおける認証フローの設定について説明します。

------
#### [ App client supported flows ]

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

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

**認証フロー用にアプリケーションクライアントを設定するには (コンソール)**

1. にサインイン AWS し、[Amazon Cognito ユーザープールコンソール](https://console.aws.amazon.com/cognito/v2/idp)に移動します。ユーザープールを選択するか、新しいユーザープールを作成します。

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

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

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

**認証フロー用にアプリケーションクライアントを設定するには (API/SDK)**  
Amazon Cognito API を使用してアプリケーションクライアントで利用可能な認証フローを設定するには、[CreateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPoolClient.html#CognitoUserPools-CreateUserPoolClient-request-ExplicitAuthFlows) リクエストまたは [UpdateUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPoolClient.html#CognitoUserPools-UpdateUserPoolClient-request-ExplicitAuthFlows) リクエストで `ExplicitAuthFlows` の値を設定します。次の例では、セキュアリモートパスワード (SRP) と選択ベースの認証をクライアントにプロビジョニングします。

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

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


**アプリケーションクライアントでのフローのサポート**  

| 認証フロー | 互換性 | コンソール | API  | 
| --- | --- | --- | --- | 
| [選択ベースの認証](authentication-flows-selection-sdk.md#authentication-flows-selection-choice) | サーバー側、クライアント側 | サインイン時に認証タイプを選択する | ALLOW\_USER\_AUTH | 
| [永続的なパスワードによるサインイン](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-password) | クライアント側 | ユーザー名とパスワードでサインインする | ALLOW\_USER\_PASSWORD\_AUTH | 
| [永続的なパスワードと安全なペイロードによるサインイン](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-srp) | サーバー側、クライアント側 | セキュアリモートパスワード (SRP) でサインインする | ALLOW\_USER\_SRP\_AUTH | 
| [トークンの更新](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-refresh) | サーバー側、クライアント側 | 既存の認証済みセッションから新しいユーザートークンを取得する | ALLOW\_REFRESH\_TOKEN\_AUTH | 
| [サーバー側の認証](authentication-flows-public-server-side.md#amazon-cognito-user-pools-server-side-authentication-flow) | サーバー側 | サーバー側の管理認証情報でサインインする | ALLOW\_ADMIN\_USER\_PASSWORD\_AUTH | 
| [カスタム認証](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-custom) | サーバー側およびクライアント側のカスタム構築アプリケーション。マネージドログインとの互換性なし。 | Lambda トリガーからのカスタム認証フローでサインインする | ALLOW\_CUSTOM\_AUTH | 

------
#### [ Implement flows in your application ]

マネージドログインでは、設定した認証オプションが、サインインページで自動的に利用可能になります。カスタム構築アプリケーションでは、初期フローの宣言から認証を開始します。
+ ユーザーのフローオプションのリストから選択するには、`USER_AUTH` フローで[選択ベースの認証](authentication-flows-selection-sdk.md#authentication-flows-selection-choice)を宣言します。このフローでは、[パスキー](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)認証や[パスワードなし](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)の認証など、クライアントベースの認証フローでは利用できない認証方法を利用できます。
+ 認証フローを事前に選択するには、アプリケーションクライアントで利用可能な他のフローで[クライアントベースの認証](authentication-flows-selection-sdk.md#authentication-flows-selection-client)を宣言します。

ユーザーをサインインさせるときは、[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-AuthFlow) リクエストまたは [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-AuthFlow) リクエストの本文に `AuthFlow` パラメータを含める必要があります。

選択ベースの認証:

```
"AuthFlow": "USER_AUTH"
```

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

```
"AuthFlow": "USER_SRP_AUTH"
```

------

## ユーザープールによる認証について知っておくべきこと
<a name="authentication-flow-things-to-know"></a>

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

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

** AWS SDK 認証でのみ使用できるカスタム認証フロー**  
マネージドログインまたはクラシックのホストされた UI で、*カスタム認証フロー*や [Lambda トリガーによるカスタム認証](user-pool-lambda-challenge.md)を行うことはできません。カスタム認証は [AWS SDK による認証](authentication-flows-selection-sdk.md)で利用できます。

**外部 ID プロバイダー (IdP) によるサインイン用のマネージドログイン**  
[AWS SDKs による認証](authentication-flows-selection-sdk.md)では[、サードパーティーの IdPs](cognito-user-pools-identity-federation.md) を介してユーザーにサインインすることはできません。マネージドログインまたはクラシックのホストされた UI を実装し、IdP にリダイレクトしてから、結果の認証オブジェクトをアプリケーション内の OIDC ライブラリで処理する必要があります。マネージドログインの詳細については、「[ユーザープールのマネージドログイン](cognito-user-pools-managed-login.md)」を参照してください。

**パスワードなしの認証が他のユーザー機能に与える影響**  
ユーザープールとアプリケーションクライアントで[ワンタイムパスワード](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passwordless)または[パスキー](amazon-cognito-user-pools-authentication-flow-methods.md#amazon-cognito-user-pools-authentication-flow-methods-passkey)を使用してパスワードなしのサインインをアクティブ化すると、ユーザーの作成と移行に影響します。パスワードなしのサインインがアクティブな場合:  

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

1. SDK ベースの[SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) オペレーションの場合、ユーザーはサインアップ時にパスワードを入力する必要はありません。マネージドログインとホストされた UI では、パスワードなしの認証が許可されている場合でも、サインアップページでパスワードが必要です。詳細については、「[ユーザーアカウントのサインアップと確認](signing-up-users-in-your-app.md)」を参照してください。

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

1. パスワードなしの認証では、[ユーザー移行の Lambda トリガー](user-pool-lambda-migrate-user.md)は呼び出されません。

1. ワンタイムパスワード (OTP) の最初の要素でサインインするユーザーは、セッションに[多要素認証 (MFA) ](user-pool-settings-mfa.md)要素を追加できません。ユーザー検証付きのパスキーは、 で設定すると MFA 要件を満たすことができます`MULTI_FACTOR_WITH_USER_VERIFICATION`。

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

**Topics**
+ [認証フローセッションの持続期間](#authentication-flow-session-duration)
+ [サインイン試行の失敗時におけるロックアウト動作](#authentication-flow-lockout-behavior)

### 認証フローセッションの持続期間
<a name="authentication-flow-session-duration"></a>

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

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

------
#### [ Amazon Cognito console ]

**アプリクライアントの認証フローセッション持続期間を設定するには (AWS マネジメントコンソール)**

1. ユーザープールの **[App integration]** (アプリの統合) タブで、**[App clients and analytics]** (アプリクライアントと分析) コンテナからアプリクライアントの名前を選択します。

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

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

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

------
#### [ User pools API ]

**アプリクライアントの認証フローセッション持続期間を設定するには (Amazon Cognito API)**

1. `DescribeUserPoolClient` リクエストから既存のユーザープール設定を使用して `UpdateUserPoolClient` リクエストを準備します。`UpdateUserPoolClient` リクエストには、既存のアプリクライアントのプロパティをすべて含める必要があります。

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

------

アプリクライアントの詳細については、「[アプリケーションクライアントによるアプリケーション固有の設定](user-pool-settings-client-apps.md)」を参照してください。

### サインイン試行の失敗時におけるロックアウト動作
<a name="authentication-flow-lockout-behavior"></a>

ユーザーのパスワードによるサインイン試行が 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 分間、サインイン試行を開始してはなりません。この動作は変更される可能性があります。この動作は、パスワードベースの認証も実行しない限り、カスタムチャレンジに適用されません。

## 認証セッションの例
<a name="amazon-cognito-user-pools-authentication-flow"></a>

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

![ユーザーに入力を求め、 AWS SDK でサインインするアプリケーションを示すフローチャート。](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/authentication-api-userauth.png)


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[AWS Lambda トリガー](cognito-user-pools-working-with-lambda-triggers.md)を使用して、ユーザーの認証方法をカスタマイズできます。トリガーは独自のチャレンジを認証フローの一部として発行し検証を行います。

また、安全なバックエンドサーバーでは、管理者の認証フローを使用することもできます。[ユーザー移行の認証フロー](cognito-user-pools-using-import-tool.md)を使用すると、ユーザーにパスワードのリセットを要求することなく、ユーザーを移行できます。