

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

# 認証チャレンジの定義の 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 };
```

------