

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

# カスタム認証チャレンジの Lambda トリガー
<a name="user-pool-lambda-challenge"></a>

Amazon Cognito ユーザープールの認証フローを構築した後で、組み込みフローを超えた認証モデルに拡張したい場合があります。カスタムチャレンジトリガーの一般的なユースケースの 1 つは、ユーザー名、パスワード、および多要素認証 (MFA) を超えた追加のセキュリティチェックを実装することです。カスタムチャレンジは、Lambda がサポートするプログラミング言語で生成できる質問とレスポンスです。例えば、認証を許可する前に、CAPTCHA を解決することや、セキュリティの質問に回答することをユーザーに要求する場合があります。もう 1 つの潜在的なニーズは、特殊な認証要素やデバイスと統合することです。または、ハードウェアセキュリティキーまたは生体認証デバイスでユーザーを認証するソフトウェアを開発済みである場合もあります。カスタムチャレンジの認証成功の定義は、どのような回答であっても、Lambda 関数が正しいものとして受け入れる回答です。例えば、固定文字列、または外部 API からの十分なレスポンスです。

カスタムチャレンジを使用した認証を開始して認証プロセスを完全に制御することも、アプリケーションがカスタムチャレンジを受信する前にユーザー名パスワード認証を実行することもできます。

カスタム認証チャレンジの Lambda トリガー

**[定義](user-pool-lambda-define-auth-challenge.md)**  
チャレンジシーケンスを開始します。新しいチャレンジを開始するか、認証を完了としてマークするか、認証の試行を停止するかを決定します。

**[作成](user-pool-lambda-create-auth-challenge.md)**  
ユーザーが回答する必要がある質問をアプリケーションに発行します。この関数は、アプリケーションがユーザーに表示するセキュリティの質問や CAPTCHA へのリンクを提示する場合があります。

**[検証](user-pool-lambda-verify-auth-challenge-response.md)**  
予想される回答を把握し、それをチャレンジレスポンスでアプリケーションが提供する回答と比較します。この関数は、CAPTCHA サービスの API を呼び出して、ユーザーの試行したソリューションの期待される結果を取得することができます。

これらの 3 つの Lambda 関数は連鎖して、完全に制御範囲内で独自の設計の認証メカニズムを提示します。カスタム認証は、クライアントと Lambda 関数にアプリケーションロジックを必要とするため、マネージドログイン内ではカスタム認証を処理できません。この認証システムには、デベロッパーの労力が追加で必要です。アプリケーションは、ユーザープール API を使用して認証フローを実行し、結果として返されるチャレンジを、カスタム構築されたログインインターフェイスで処理する必要があります。このインターフェイスは、カスタム認証チャレンジの中心に質問を表示します。

![\[チャレンジの Lambda トリガー\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/lambda-challenges.png)


カスタム認証の実装の詳細については、「[カスタム認証フローとチャレンジ](amazon-cognito-user-pools-authentication-flow-methods.md#Custom-authentication-flow-and-challenges)」を参照してください。

API オペレーション [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) または [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) と [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) または [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) 間の認証。このフローでは、認証が失敗するか、トークンが発行されるまで、ユーザーは引き続きチャレンジに回答して認証を行います。チャレンジレスポンスが新しいチャレンジとなる場合があります。この場合、アプリケーションは新しいチャレンジに対して必要な回数を応答します。認証は、認証チャレンジの定義関数がそれまでの結果を分析し、すべてのチャレンジが回答されたと判断し、`IssueTokens` を返すときに完了します。

**Topics**
+ [カスタムチャレンジフローでの SRP 認証](#user-pool-lambda-challenge-srp-authentication)
+ [認証チャレンジの定義の Lambda トリガー](user-pool-lambda-define-auth-challenge.md)
+ [認証チャレンジの作成の Lambda トリガー](user-pool-lambda-create-auth-challenge.md)
+ [認証チャレンジレスポンスの検証の Lambda トリガー](user-pool-lambda-verify-auth-challenge-response.md)

## カスタムチャレンジフローでの SRP 認証
<a name="user-pool-lambda-challenge-srp-authentication"></a>

Amazon Cognito では、カスタムチャレンジを発行する前にユーザーパスワードを検証させることができます。[リクエストレートクォータ](quotas.md#category_operations.title)の認証カテゴリに関連付けられているすべての Lambda トリガーは、カスタムチャレンジフローで SRP 認証を行うと、実行されます。以下は、そのプロセスの概要です。

1. アプリは、`AuthParameters` マップを使用して `InitiateAuth` または `AdminInitiateAuth` を呼び出してサインインを開始します。パラメータには `CHALLENGE_NAME: SRP_A,`、`SRP_A` および `USERNAME` の値を含める必要があります。

1. Amazon Cognito は、`challengeName: SRP_A` と `challengeResult: true` を含む初期セッションで、認証チャレンジの定義 Lambda トリガーを呼び出します。

1. Lambda 関数は、これらの入力を受け取った後、`challengeName: PASSWORD_VERIFIER`、`issueTokens: false`、`failAuthentication: false` で応答します。

1. パスワードの検証が成功すると、Amazon Cognito `challengeName: PASSWORD_VERIFIER` と `challengeResult: true` が含まれる新しいセッションで Lambda 関数を再度呼び出します。

1. カスタムチャレンジを開始するために、Lambda 関数は `challengeName: CUSTOM_CHALLENGE`、`issueTokens: false`、および `failAuthentication: false` で応答します。パスワード検証でカスタム認証フローを開始したくない場合は、`CHALLENGE_NAME: CUSTOM_CHALLENGE` を含む `AuthParameters` マップでサインインを開始できます。

1. チャレンジループは、すべてのチャレンジが回答されるまで繰り返します。

以下は、SRP フローによるカスタム認証の前になされる開始 `InitiateAuth` リクエストの例です。

```
{
    "AuthFlow": "CUSTOM_AUTH",
    "ClientId": "1example23456789",
    "AuthParameters": {
        "CHALLENGE_NAME": "SRP_A",
        "USERNAME": "testuser",
        "SRP_A": "[SRP_A]",
        "SECRET_HASH": "[secret hash]"
    }
}
```

### カスタム認証 SRP フローでのパスワードのリセット
<a name="user-pool-lambda-challenge-force-password-change"></a>

ユーザーが `FORCE_CHANGE_PASSWORD` ステータスの場合、カスタム認証フローは、認証チャレンジの整合性を維持しながら、パスワード変更ステップを統合する必要があります。Amazon Cognito は、`NEW_PASSWORD_REQUIRED` チャレンジ中に [[認証チャレンジを定義]](user-pool-lambda-define-auth-challenge.md) Lambda トリガーを呼び出します。このシナリオの場合、ユーザーがカスタムチャレンジフローと SRP 認証を使用してサインインするときに、パスワードのリセット状態にあれば、新しいパスワードを設定できます。

ユーザーは、`RESET_REQUIRED` ステータスまたは `FORCE_CHANGE_PASSWORD` ステータスである場合、`NEW_PASSWORD` を使用して `NEW_PASSWORD_REQUIRED` チャレンジに[応答](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html#API_RespondToAuthChallenge_RequestParameters)する必要があります。SRP を使用したカスタム認証の場合、ユーザーが SRP `NEW_PASSWORD_REQUIRED` チャレンジを完了すると、Amazon Cognito は `PASSWORD_VERIFIER` チャレンジを返します。認証チャレンジ定義トリガーは、両方のチャレンジ結果を `session` 配列で受け取り、ユーザーがパスワードを正常に変更した後で、追加のカスタムチャレンジを続行できます。

認証チャレンジ定義の Lambda トリガーは、SRP 認証、パスワードリセット、以降のカスタムチャレンジを通じて、チャレンジシーケンスを管理する必要があります。トリガーは、完了したチャレンジの配列 (`PASSWORD_VERIFIER` と `NEW_PASSWORD_REQUIRED` の両方の結果を含む) を `session` パラメータで受け取ります。実装の例については、「[認証チャレンジの定義の例](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example)」を参照してください。

#### 認証フローの手順
<a name="user-pool-lambda-challenge-password-flow-steps"></a>

ユーザーがカスタムチャレンジの前にパスワードを検証する必要がある場合は、次の手順に従います。

1. アプリは、`AuthParameters` マップを使用して `InitiateAuth` または `AdminInitiateAuth` を呼び出してサインインを開始します。パラメータには `CHALLENGE_NAME: SRP_A` に加えて、`SRP_A` と `USERNAME` の値を含める必要があります。

1. Amazon Cognito は、`challengeName: SRP_A` と `challengeResult: true` を含む初期セッションで、認証チャレンジの定義 Lambda トリガーを呼び出します。

1. Lambda 関数は、これらの入力を受け取った後、`challengeName: PASSWORD_VERIFIER`、`issueTokens: false`、`failAuthentication: false` で応答します。

1. パスワードの検証が成功すると、次の 2 つのどちらかになります。  
**通常ステータスのユーザーの場合:**  
Amazon Cognito は、`challengeName: PASSWORD_VERIFIER` と `challengeResult: true` を含む新しいセッションで Lambda 関数を再度呼び出します。  
カスタムチャレンジを開始するために、Lambda 関数は `challengeName: CUSTOM_CHALLENGE`、`issueTokens: false`、および `failAuthentication: false` で応答します。  
**`RESET_REQUIRED` ステータスまたは `FORCE_CHANGE_PASSWORD` ステータスのユーザーの場合:**  
Amazon Cognito は、`challengeName: PASSWORD_VERIFIER` と `challengeResult: true` を含むセッションで Lambda 関数を呼び出します。  
Lambda 関数は、`challengeName: NEW_PASSWORD_REQUIRED`、`issueTokens: false`、および `failAuthentication: false` により、これに応答する必要があります。  
パスワードが正常に変更されると、Amazon Cognito は `PASSWORD_VERIFIER` と `NEW_PASSWORD_REQUIRED` の両方の結果を含むセッションで Lambda 関数を呼び出します。  
カスタムチャレンジを開始するために、Lambda 関数は `challengeName: CUSTOM_CHALLENGE`、`issueTokens: false`、および `failAuthentication: false` で応答します。

1. チャレンジループは、すべてのチャレンジが回答されるまで繰り返します。

パスワード検証でカスタム認証フローを開始したくない場合は、`CHALLENGE_NAME: CUSTOM_CHALLENGE` を含む `AuthParameters` マップでサインインを開始できます。

#### セッション管理
<a name="user-pool-lambda-challenge-session-management"></a>

認証フローは、一連のセッション ID とチャレンジ結果を通じてセッションの継続性を維持します。チャレンジレスポンスごとに新しいセッション ID を生成して、セッション再利用エラーを防ぎます。これは、多要素認証フローでは特に重要です。

チャレンジの結果は、Lambda トリガーが受信するセッション配列に時系列で保存されます。`FORCE_CHANGE_PASSWORD` ステータスのユーザーの場合、セッション配列には以下が含まれます。

1. `session[0]` - 最初の `SRP_A` チャレンジ

1. `session[1]` - `PASSWORD_VERIFIER` の結果

1. `session[2]` - `NEW_PASSWORD_REQUIRED` の結果

1. 後続の要素 - 追加のカスタムチャレンジの結果

#### 認証フローの例
<a name="user-pool-lambda-challenge-example-flow"></a>

次の例は、パスワード変更とカスタム CAPTCHA チャレンジの両方を完了する必要があるユーザー (`FORCE_CHANGE_PASSWORD` ステータス) の完全なカスタム認証フローを示しています。

1. **InitiateAuth リクエスト**

   ```
   {
       "AuthFlow": "CUSTOM_AUTH",
       "ClientId": "1example23456789",
       "AuthParameters": {
           "CHALLENGE_NAME": "SRP_A",
           "USERNAME": "testuser",
           "SRP_A": "[SRP_A]"
       }
   }
   ```

1. **InitiateAuth レスポンス**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ChallengeParameters": {
           "USER_ID_FOR_SRP": "testuser"
       },
       "Session": "[session_id_1]"
   }
   ```

1. **`PASSWORD_VERIFIER` を使用した RespondToAuthChallenge リクエスト**

   ```
   {
       "ChallengeName": "PASSWORD_VERIFIER",
       "ClientId": "1example23456789",
       "ChallengeResponses": {
           "PASSWORD_CLAIM_SIGNATURE": "[claim_signature]",
           "PASSWORD_CLAIM_SECRET_BLOCK": "[secret_block]",
           "TIMESTAMP": "[timestamp]",
           "USERNAME": "testuser"
       },
       "Session": "[session_id_1]"
   }
   ```

1. **`NEW_PASSWORD_REQUIRED` チャレンジを使用した RespondToAuthChallenge レスポンス**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ChallengeParameters": {},
       "Session": "[session_id_2]"
   }
   ```

1. **`NEW_PASSWORD_REQUIRED` を使用した RespondToAuthChallenge リクエスト**

   ```
   {
       "ChallengeName": "NEW_PASSWORD_REQUIRED",
       "ClientId": "1example23456789",
       "ChallengeResponses": {
           "NEW_PASSWORD": "[password]",
           "USERNAME": "testuser"
       },
       "Session": "[session_id_2]"
   }
   ```

1. **CAPTCHA カスタムチャレンジを使用した RespondToAuthChallenge レスポンス**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ChallengeParameters": {
           "captchaUrl": "url/123.jpg"
       },
       "Session": "[session_id_3]"
   }
   ```

1. **CAPTCHA カスタムチャレンジを使用した RespondToAuthChallenge リクエスト**

   ```
   {
       "ChallengeName": "CUSTOM_CHALLENGE",
       "ClientId": "1example23456789",
       "ChallengeResponses": {
           "ANSWER": "123",
           "USERNAME": "testuser"
       },
       "Session": "[session_id_3]"
   }
   ```

**6。最終的な成功レスポンス**

```
{
    "AuthenticationResult": {
        "AccessToken": "eyJra456defEXAMPLE",
        "ExpiresIn": 3600,
        "IdToken": "eyJra789ghiEXAMPLE",
        "RefreshToken": "eyJjd123abcEXAMPLE",
        "TokenType": "Bearer"
    },
    "ChallengeParameters": {}
}
```

# 認証チャレンジの定義の Lambda トリガー
<a name="user-pool-lambda-define-auth-challenge"></a>

認証チャレンジ定義トリガーは、カスタム認証フローでチャレンジシーケンスを維持する Lambda 関数です。チャレンジシーケンスの成功または失敗を宣言し、シーケンスがまだ完了していない場合に次のチャレンジを設定します。

![\[チャレンジの Lambda トリガー\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/lambda-challenges1.png)


**認証チャレンジの定義**  
 Amazon Cognito は、このトリガーを呼び出して[カスタム認証フロー](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow)を開始します。

この Lambda トリガーのリクエストには、`session` が含まれます。`session` パラメータは、現在の認証プロセスでユーザーに提示されたすべてのチャレンジが含まれる配列です。リクエストには、対応する結果も含まれます。`session` 配列は、チャレンジの詳細 (`ChallengeResult`) を時系列に保存します。チャレンジ `session[0]` は、ユーザーが最初に受け取るチャレンジを表します。

**Topics**
+ [認証チャレンジの定義の Lambda トリガーのパラメータ](#cognito-user-pools-lambda-trigger-syntax-define-auth-challenge)
+ [認証チャレンジの定義の例](#aws-lambda-triggers-define-auth-challenge-example)

## 認証チャレンジの定義の Lambda トリガーのパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge"></a>

Amazon Cognito がこの Lambda 関数に渡すリクエストは、以下のパラメータと Amazon Cognito がすべてのリクエストに追加する[共通パラメータ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared)を組み合わせたものです。

------
#### [ JSON ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
                . . .
        },
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "challengeName": "string",
        "issueTokens": boolean,
        "failAuthentication": boolean
    }
}
```

------

### 認証チャレンジの定義のリクエストパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-request"></a>

 Amazon Cognito が Lambda 関数を呼び出すときに、次のパラメータを提供します。

**userAttributes**  
ユーザー属性を表す 1 つ以上の名前 - 値ペア。

**userNotFound**  
ユーザープールクライアントの `PreventUserExistenceErrors` が `ENABLED` に設定されている場合に、Amazon Cognito が入力するブール値です。`true` の値は、ユーザー ID (ユーザー名、メールアドレス、その他の詳細など) が既存のいずれのユーザーとも一致しなかったことを意味します。`PreventUserExistenceErrors` が `ENABLED` に設定されている場合、サービスは存在しないユーザーをアプリに通知しません。Lambda 関数が同じユーザーエクスペリエンスを維持し、レイテンシーを考慮することをお勧めします。この方法では、発信者はユーザーが存在する場合と存在しない場合で異なる動作を検出することができません。

**セッション**  
`ChallengeResult` 要素の配列。それぞれに以下の要素が含まれます。    
**challengeName**  
次のチャレンジタイプのいずれかです: `CUSTOM_CHALLENGE`、`SRP_A`、`PASSWORD_VERIFIER`、`SMS_MFA`、`EMAIL_OTP`、`SOFTWARE_TOKEN_MFA`、`DEVICE_SRP_AUTH`、`DEVICE_PASSWORD_VERIFIER`、または `ADMIN_NO_SRP_AUTH`。  
認証チャレンジの定義機能が、多要素認証を設定したユーザーに `PASSWORD_VERIFIER` チャレンジを発行すると、Amazon Cognito はそれに続いて `SMS_MFA`、`EMAIL_OTP`、または `SOFTWARE_TOKEN_MFA` のチャレンジを行います。これらは、多要素認証コードのプロンプトです。関数には、`SMS_MFA`、`EMAIL_OTP`、および `SOFTWARE_TOKEN_MFA` のチャレンジからの入力イベントの処理を含めます。認証チャレンジの定義関数から MFA チャレンジを呼び出す必要はありません。  
ユーザーが正常に認証され、トークンが発行されるべきかを判断するときは、常に define auth challenge 関数で `challengeName` をチェックし、予想された値と一致することを確認します。  
**challengeResult**  
ユーザーが正常にチャレンジを完了した場合は `true` に、それ以外の場合は `false` に設定します。  
**challengeMetadata**  
カスタムチャレンジの名前を入力します。`challengeName` が `CUSTOM_CHALLENGE` である場合にのみ使用されます。

**clientMetadata**  
認証チャレンジの定義のトリガーに指定する Lambda 関数へのカスタム入力として提供できる 1 つ、または複数のキー/値ペア。このデータを Lambda 関数に渡すには、[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) および [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API オペレーションで `ClientMetadata` パラメータを使用できます。define auth challenge 関数を呼び出すリクエストに、[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) および [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API オペレーションの ClientMetadata パラメータに渡されたデータは含まれません。

### 認証チャレンジの定義のレスポンスパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-response"></a>

レスポンスで、認証プロセスの次のステージを返すことができます。

**challengeName**  
次のチャレンジの名前を含む文字列。ユーザーに新しいチャレンジを提示する場合は、ここでチャレンジ名を指定します。

**issueTokens**  
ユーザーが認証チャレンジを十分に完了したと判断した場合、`true` に設定します。ユーザーがチャレンジを十分に満たしていない場合は、`false` に設定します。

**failAuthentication**  
現在の認証プロセスを終了する場合は、`true` に設定します。現在の認証プロセスを続行するには、`false` に設定します。

## 認証チャレンジの定義の例
<a name="aws-lambda-triggers-define-auth-challenge-example"></a>

この例では、認証用に一連のチャレンジを定義し、それらのチャレンジがすべて正常に完了した場合にのみトークンを発行します。ユーザーが `SRP_A` チャレンジと `PASSWORD_VERIFIER` チャレンジを使用して SRP 認証を完了すると、この関数は、認証チャレンジの作成トリガーを呼び出す `CUSTOM_CHALLENGE` を、ユーザーに渡します。[認証チャレンジの作成例](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example)と組み合わせることで、このシーケンスは、チャレンジ 3 で CAPTCHA チャレンジを提供し、チャレンジ 4 でセキュリティの質問を提供します。

ユーザーが CAPTCHA を解決してセキュリティの質問に回答すると、この関数は、ユーザープールがトークンを発行できることを確認します。SRP 認証は必須ではありません。CAPTCHA とセキュリティの質問をチャレンジ 1 とチャレンジ 2 として設定することもできます。認証チャレンジの定義関数が SRP チャレンジを宣言しない場合、ユーザーの成功はカスタムプロンプトへの応答によってのみ決定されます。

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.session.length === 1 &&
    event.request.session[0].challengeName === "SRP_A"
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "PASSWORD_VERIFIER";
  } else if (
    event.request.session.length === 2 &&
    event.request.session[1].challengeName === "PASSWORD_VERIFIER" &&
    event.request.session[1].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 3 &&
    event.request.session[2].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[2].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 4 &&
    event.request.session[3].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[3].challengeResult === true
  ) {
    event.response.issueTokens = true;
    event.response.failAuthentication = false;
  } else {
    event.response.issueTokens = false;
    event.response.failAuthentication = true;
  }

  return event;
};

export { handler };
```

------

# 認証チャレンジの作成の Lambda トリガー
<a name="user-pool-lambda-create-auth-challenge"></a>

認証チャレンジの作成のトリガーは、認証チャレンジの定義トリガーによって宣言された各チャレンジの詳細を持つ Lambda 関数です。これは、認証チャレンジの定義トリガーによって宣言されたチャレンジ名を処理し、アプリケーションがユーザーに提示する必要がある `publicChallengeParameters` を返します。次に、この関数は、ユーザープールが認証チャレンジ検証トリガーに渡すチャレンジに対する回答、 `privateChallengeParameters` をユーザープールに提供します。認証チャレンジの定義トリガーがチャレンジシーケンスを管理する場合、認証チャレンジの作成トリガーはチャレンジの内容を管理します。

![\[チャレンジの Lambda トリガー\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/lambda-challenges2.png)


**認証チャレンジの作成**  
**認証チャレンジの定義**トリガーの一部としてカスタムチャレンジが指定されている場合、Amazon Cognito は**認証チャレンジの定義**後にこのトリガーを呼び出します。これにより、[カスタム認証フロー](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow)を作成します。

この Lambda トリガーは、ユーザーに提示するチャレンジを作成するために呼び出されます。この Lambda トリガーのリクエストには `challengeName` と `session` が含まれます。`challengeName` は文字列であり、ユーザーに対する次のチャレンジの名前です。この属性の値は、認証チャレンジの定義の Lambda トリガーに設定されています。

チャレンジループは、すべてのチャレンジに応答するまで繰り返されます。

**Topics**
+ [認証チャレンジの作成 Lambda トリガーパラメータ](#cognito-user-pools-lambda-trigger-syntax-create-auth-challenge)
+ [認証チャレンジの作成の例](#aws-lambda-triggers-create-auth-challenge-example)

## 認証チャレンジの作成 Lambda トリガーパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge"></a>

Amazon Cognito がこの Lambda 関数に渡すリクエストは、以下のパラメータと Amazon Cognito がすべてのリクエストに追加する[共通パラメータ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared)を組み合わせたものです。

------
#### [ JSON ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "challengeName": "string",
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "publicChallengeParameters": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeMetadata": "string"
    }
}
```

------

### 認証チャレンジの作成のリクエストパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-request"></a>

**userAttributes**  
ユーザー属性を表す 1 つ以上の名前 - 値ペア。

**userNotFound**  
このブール値は、ユーザープールクライアントで `PreventUserExistenceErrors` が `ENABLED` に設定されている場合に設定されます。

**challengeName**  
新しいチャレンジの名前。

**session**  
session 要素は `ChallengeResult` 要素の配列であり、それぞれに以下の要素が含まれます。    
**challengeName**  
チャレンジタイプ。`"CUSTOM_CHALLENGE"`、`"PASSWORD_VERIFIER"`、`"SMS_MFA"`、`"DEVICE_SRP_AUTH"`、`"DEVICE_PASSWORD_VERIFIER"`、`"NEW_PASSWORD_REQUIRED"`、または `"ADMIN_NO_SRP_AUTH"` のいずれか。  
**challengeResult**  
ユーザーが正常にチャレンジを完了した場合は `true` に、それ以外の場合は `false` に設定します。  
**challengeMetadata**  
カスタムチャレンジの名前を入力します。`challengeName` が `"CUSTOM_CHALLENGE"` である場合にのみ使用されます。

**clientMetadata**  
認証チャレンジの作成のトリガーに指定する Lambda 関数へのカスタム入力として提供できる 1 つ、または複数のキー/値ペア。このデータは、[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) および [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API アクションで ClientMetadata パラメータを使用することによって Lambda 関数に渡すことができます。create auth challenge 関数を呼び出すリクエストに、[AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) および [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API オペレーションで ClientMetadata パラメータに渡されたデータは含まれません。

### 認証チャレンジの作成のレスポンスパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-create-auth-challenge-response"></a>

**publicChallengeParameters**  
クライアントアプリケーションでユーザーに提示されるチャレンジに使用する 1 つ以上のキー - 値ペア。このパラメータには、ユーザーにチャレンジを正確に提示するために必要なすべての情報を含める必要があります。

**privateChallengeParameters**  
このパラメータは、認証チャレンジレスポンスの検証の Lambda トリガー以外では使用されません。このパラメータには、チャレンジに対するユーザーのレスポンスを検証するために必要な情報のすべてを含める必要があります。つまり、`publicChallengeParameters` には、ユーザーに示される質問が含まれ、`privateChallengeParameters` には、質問に対する有効な回答が含まれます。

**challengeMetadata**  
カスタムチャレンジの名前 (カスタムチャレンジの場合)。

## 認証チャレンジの作成の例
<a name="aws-lambda-triggers-create-auth-challenge-example"></a>

この関数には、[認証チャレンジの定義例](user-pool-lambda-define-auth-challenge.md#aws-lambda-triggers-define-auth-challenge-example)のチャレンジシーケンスに対応する 2 つのカスタムチャレンジがあります。最初の 2 つのチャレンジは SRP 認証です。3 番目のチャレンジの場合、この関数はチャレンジレスポンスで CAPTCHA URL をアプリケーションに返します。アプリケーションは、指定された URL で CAPTCHA をレンダリングし、ユーザーの入力を返します。CAPTCHA イメージの URL が "`captchaUrl`" としてパブリックチャレンジパラメータに追加され、想定される回答がプライベートチャレンジパラメータに追加されます。

4 番目のチャレンジの場合、この関数はセキュリティの質問を返します。アプリケーションは質問をレンダリングし、ユーザーに回答を求めます。ユーザーが両方のカスタムチャレンジを解決すると、認証チャレンジの定義トリガーは、ユーザープールがトークンを発行できることを確認します。

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (event.request.challengeName !== "CUSTOM_CHALLENGE") {
    return event;
  }

  if (event.request.session.length === 2) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.captchaUrl = "url/123.jpg";
    event.response.privateChallengeParameters.answer = "5";
  }

  if (event.request.session.length === 3) {
    event.response.publicChallengeParameters = {};
    event.response.privateChallengeParameters = {};
    event.response.publicChallengeParameters.securityQuestion =
      "Who is your favorite team mascot?";
    event.response.privateChallengeParameters.answer = "Peccy";
  }

  return event;
};

export { handler };
```

------

# 認証チャレンジレスポンスの検証の Lambda トリガー
<a name="user-pool-lambda-verify-auth-challenge-response"></a>

認証チャレンジの検証トリガーは、ユーザーが提供したレスポンスを既知のレスポンスと比較する Lambda 関数です。この関数は、ユーザーがチャレンジに正しく応答したかどうかをユーザープールに伝えます。認証チャレンジの検証トリガーが `true` の `answerCorrect` で応答すると、認証シーケンスは続行できます。

![\[チャレンジの Lambda トリガー\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/lambda-challenges3.png)


**認証チャレンジレスポンスの検証**  
Amazon Cognito は、このトリガーが呼び出して、カスタム認証チャレンジに対するユーザーからのレスポンスが有効であるかどうかを検証します。これはユーザープールの[カスタム認証フロー](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow)の一環です。

このトリガーのリクエストには `privateChallengeParameters` および `challengeAnswer` パラメータが含まれます。`privateChallengeParameters` 値は、認証チャレンジの作成の Lambda トリガーによって返され、ユーザーからの期待されるレスポンスが含まれます。`challengeAnswer` パラメータには、チャレンジに対するユーザーのレスポンスが含まれます。

レスポンスには、`answerCorrect` 属性が含まれます。ユーザーがチャレンジを正常に完了すると、Amazon Cognito は属性値を `true` に設定します。ユーザーがチャレンジを正常に完了しなかった場合、Amazon Cognito は値を `false` に設定します。

チャレンジループは、すべてのチャレンジが回答されるまで繰り返します。

**Topics**
+ [認証チャレンジの検証の Lambda トリガーのパラメータ](#cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge)
+ [認証チャレンジレスポンスの確認の例](#aws-lambda-triggers-verify-auth-challenge-response-example)

## 認証チャレンジの検証の Lambda トリガーのパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge"></a>

Amazon Cognito がこの Lambda 関数に渡すリクエストは、以下のパラメータと Amazon Cognito がすべてのリクエストに追加する[共通パラメータ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared)を組み合わせたものです。

------
#### [ JSON ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
            . . .
        },
        "privateChallengeParameters": {
            "string": "string",
            . . .
        },
        "challengeAnswer": "string",
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "answerCorrect": boolean
    }
}
```

------

### 認証チャレンジの検証のリクエストパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-request"></a>

**userAttributes**  
このパラメータには、ユーザー属性を表す 1 つ以上の名前-値ペアが含まれます。

**userNotFound**  
Amazon Cognito がユーザープールクライアントの `PreventUserExistenceErrors` を `ENABLED` に設定すると、Amazon Cognito はこのブール値を入力します。

**privateChallengeParameters**  
このパラメータは、認証チャレンジの作成トリガーから取得されます。ユーザーがチャレンジに合格したかどうかを判断するために、Amazon Cognito はパラメータをユーザーの **challengeAnswer** パラメータと比較します。  
このパラメータには、チャレンジに対するユーザーのレスポンスを検証するために必要な情報のすべてが含まれます。その情報には、Amazon Cognito がユーザーに提示する質問 (`publicChallengeParameters`) と、その質問に対する有効な回答 (`privateChallengeParameters`) が含まれます。認証チャレンジレスポンスの検証の Lambda トリガーのみがこのパラメータを使用します。

**challengeAnswer**  
このパラメータ値は、チャレンジに対するユーザーの回答です。

**clientMetadata**  
このパラメータには、認証チャレンジの検証のトリガーの Lambda 関数へのカスタム入力として提供できる 1 つまたは複数のキーバリューペアが含まれています。このデータを Lambda 関数に渡すには、[AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html) および [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html) API オペレーションで ClientMetadata パラメータを使用します。Amazon Cognito は、認証チャレンジの検証関数に渡すリクエストの [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) および [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) API オペレーションの ClientMetadata パラメータからのデータを含めません。

### 認証チャレンジの検証のレスポンスパラメータ
<a name="cognito-user-pools-lambda-trigger-syntax-verify-auth-challenge-response"></a>

**answerCorrect**  
ユーザーがチャレンジを正常に完了した場合、Amazon Cognito はこのパラメータを `true` に設定します。ユーザーがチャレンジを正常に完了しなかった場合、Amazon Cognito はパラメータを `false` に設定します。

## 認証チャレンジレスポンスの確認の例
<a name="aws-lambda-triggers-verify-auth-challenge-response-example"></a>

この認証チャレンジの確認関数は、チャレンジに対するユーザーのレスポンスが、想定されたレスポンスと一致するかどうかを確認します。ユーザーの回答はアプリケーションからの入力によって定義され、推奨される回答は [認証チャレンジの作成トリガーレスポンス](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example)からのレスポンスの `privateChallengeParameters.answer` によって定義されます。正しい回答と与えられた回答は、どちらもこの関数への入力イベントの一部となります。

この例では、ユーザーのレスポンスが想定されたレスポンスと一致した場合、Amazon Cognito は `answerCorrect` パラメータを `true` に設定します。

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.privateChallengeParameters.answer ===
    event.request.challengeAnswer
  ) {
    event.response.answerCorrect = true;
  } else {
    event.response.answerCorrect = false;
  }

  return event;
};

export { handler };
```

------