

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Lambda 觸發程序來自訂使用者集區工作流程
<a name="cognito-user-pools-working-with-lambda-triggers"></a>

Amazon Cognito 使用 AWS Lambda 函數來修改使用者集區的身分驗證行為。您可以將使用者集區設定為在首次註冊之前、完成驗證後以及介於兩者之間的幾個階段，自動調用 Lambda 函數。您的函數可以修改身分驗證流程的預設行為、提出 API 請求來修改您的使用者集區或其他 AWS 資源，以及與外部系統通訊。Lambda 函數中的程式碼是您自己的程式碼。Amazon Cognito 會將事件資料傳送到您的函數，等待函數處理資料，而且在大多數情況下會預期回應事件，反映您想要對工作階段進行的任何變更。

在請求和回應事件系統中，您可以引入自己的驗證挑戰、在使用者集區和其他身分存放區之間遷移使用者、自訂訊息，以及修改 JSON Web 權杖 (JWT)。

Lambda 觸發程序可以自訂 Amazon Cognito 在您的使用者集區中啟動動作後，傳送給使用者的回應。例如，您可以阻止本來會成功的使用者登入。他們也可以針對您的 AWS 環境、外部 API、資料庫或身分存放區執行執行期操作。例如，遷移使用者觸發程序可以結合外部動作與 Amazon Cognito 中的變更：您可以查詢外部目錄中的使用者資訊，然後根據該外部資訊為新使用者設定屬性。

當您將 Lambda 觸發程序指派給使用者集區時，Amazon Cognito 會中斷其預設流程，從您的函數請求資訊。Amazon Cognito 會產生 JSON *事件*並將其傳遞到您的函數。此事件包含使用者建立使用者帳戶、登入、重設密碼或更新屬性之請求的相關資訊。然後，您的函數有機會採取行動，或將事件原封不動地傳回。傳回的事件未修改會通知使用者集區，以繼續執行事件的預設動作。例如，您的註冊前觸發可以自動確認`PreSignUp_SignUp`觸發來源的使用者，但外部和管理員建立的使用者傳回的事件保持不變。

下表摘錄一些使用 Lambda 觸發程序來自訂使用者集區操作的方法：


****  


- ** **自訂身分驗證流程** **
  - **作業:** 定義身分驗證挑戰 / **Description:** 決定自訂身分驗證流程中的下一個挑戰
  - **作業:** 建立身分驗證挑戰 / **Description:** 在自訂身分驗證流程中建立挑戰
  - **作業:** 確認身分驗證挑戰回應 / **Description:** 判斷自訂身分驗證流程中的回應是否正確

- ****身分驗證事件****
  - **作業:** [身分驗證前 Lambda 觸發程序](user-pool-lambda-pre-authentication.md) / **Description:** 自訂驗證接受或拒絕登入請求
  - **作業:** [身分驗證後 Lambda 觸發程序](user-pool-lambda-post-authentication.md) / **Description:** 記錄事件以進行自訂分析
  - **作業:** [產生權杖前 Lambda 觸發程序](user-pool-lambda-pre-token-generation.md) / **Description:** 增加或抑制權杖宣告

- ****聯合****
  - **作業:** [傳入聯合 Lambda 觸發](user-pool-lambda-inbound-federation.md)
  - **Description:** 在 Amazon Cognito 使用者集區中建立或更新使用者之前，轉換聯合身分使用者屬性

- ****註冊****
  - **作業:** [註冊前 Lambda 觸發程序](user-pool-lambda-pre-sign-up.md) / **Description:** 執行用於接受或拒絕註冊請求的自訂驗證
  - **作業:** [確認後 Lambda 觸發程序](user-pool-lambda-post-confirmation.md) / **Description:** 新增自訂歡迎訊息或事件記錄以進行自訂分析
  - **作業:** [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md) / **Description:** 將使用者從現有的使用者目錄遷移到使用者集區

- ****訊息****
  - **作業:** [自訂訊息 Lambda 觸發程序](user-pool-lambda-custom-message.md)
  - **Description:** 執行訊息的進階自訂及當地語系化

- ****權杖建立****
  - **作業:** [產生權杖前 Lambda 觸發程序](user-pool-lambda-pre-token-generation.md)
  - **Description:** 在 ID 和存取權杖中新增或移除屬性

- ****電子郵件和簡訊第三方供應商****
  - **作業:** [自訂寄件者 Lambda 觸發程序](user-pool-lambda-custom-sender-triggers.md)
  - **Description:** 透過第三方供應商傳送簡訊和電子郵件



**Topics**
+ [Lambda 觸發程序的須知事項](#important-lambda-considerations)
+ [新增使用者集區 Lambda 觸發條件](#triggers-working-with-lambda)
+ [使用者集區 Lambda 觸發程序事件](#cognito-user-pools-lambda-trigger-event-parameter-shared)
+ [使用者集區 Lambda 觸發程序的常用參數](#cognito-user-pools-lambda-trigger-syntax-shared)
+ [用戶端中繼資料](#working-with-lambda-trigger-client-metadata)
+ [將 API 操作連線至 Lambda 觸發程序](#lambda-triggers-by-event)
+ [將 Lambda 觸發程序連接至使用者集區功能操作](#working-with-lambda-trigger-sources)
+ [註冊前 Lambda 觸發程序](user-pool-lambda-pre-sign-up.md)
+ [確認後 Lambda 觸發程序](user-pool-lambda-post-confirmation.md)
+ [身分驗證前 Lambda 觸發程序](user-pool-lambda-pre-authentication.md)
+ [身分驗證後 Lambda 觸發程序](user-pool-lambda-post-authentication.md)
+ [傳入聯合 Lambda 觸發](user-pool-lambda-inbound-federation.md)
+ [自訂身分驗證挑戰 Lambda 觸發程序](user-pool-lambda-challenge.md)
+ [產生權杖前 Lambda 觸發程序](user-pool-lambda-pre-token-generation.md)
+ [遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md)
+ [自訂訊息 Lambda 觸發程序](user-pool-lambda-custom-message.md)
+ [自訂寄件者 Lambda 觸發程序](user-pool-lambda-custom-sender-triggers.md)

## Lambda 觸發程序的須知事項
<a name="important-lambda-considerations"></a>

準備用於 Lambda 函數的使用者集區時，請考慮下列事項：
+ Amazon Cognito 傳送給您的 Lambda 觸發程序的事件可能會隨著新功能而變更。JSON 階層中回應和請求元素的位置可能會變更，或者可能會新增元素名稱。在 Lambda 函數中，您可以期望收到本指南中所述的輸入元素鍵值對，但更嚴格的輸入驗證可能會導致函數失敗。
+ 您可以選擇 Amazon Cognito 傳送至某些觸發程序的多個版本事件之一。某些版本可能會要求您接受 Amazon Cognito 定價的變更。如需定價的詳細資訊，請參閱 [Amazon Cognito 定價](https://aws.amazon.com/cognito/pricing/)。若要在 中自訂存取權杖[產生權杖前 Lambda 觸發程序](user-pool-lambda-pre-token-generation.md)，您必須使用 *Lite* 以外的功能計劃來設定使用者集區，並更新 Lambda 觸發組態以使用事件版本 2。
+ 除了[自訂寄件者 Lambda 觸發程序](user-pool-lambda-custom-sender-triggers.md)之外，Amazon Cognito 會同步叫用 Lambda 函數。當 Amazon Cognito 呼叫您的 Lambda 函數時，該函數必須在 5 秒內回應。如果沒有，而且可以重試呼叫，Amazon Cognito 可能會重試呼叫。如果所有重試嘗試都失敗，則函數會逾時。您無法變更此 5 秒逾時值。如需詳細資訊，請參閱《 AWS Lambda 開發人員指南》中的 [Lambda 程式設計模型](https://docs.aws.amazon.com/lambda/latest/dg/foundation-progmodel.html)。

  Amazon Cognito 不會重試傳回[調用錯誤](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_Errors)且 HTTP 狀態碼為 500-599 的函數呼叫。這些代碼表示發生組態問題，導致 Lambda 無法啟動該函數。如需詳細資訊，請參閱[錯誤處理和自動重試 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/invocation-retries.html)。
+ 您無法在 Lambda 觸發程式組態中宣告函數版本。Amazon Cognito 使用者集區預設會調用最新版本的函數。但是，您可以將函數版本與別名相關聯，並在 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 或 [UpdateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserPool.html) API 請求中將觸發程式 `LambdaArn` 設為別名 ARN。此選項無法用於 AWS 管理主控台中。若要進一步了解別名，請參閱 *AWS Lambda 開發人員指南*中的 [Lambda 函數別名](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html)。
+ 若刪除 Lambda 觸發程序，必須更新使用者集區內對應的觸發程序。例如，若您刪除驗證後觸發，便須在對應的使用者集區內，將 **Post authentication (身分驗證後)** 觸發設為 **none (無)**。
+ 如果您的 Lambda 函數未將請求和回應參數傳回至 Amazon Cognito，或傳回錯誤，則驗證事件不會成功。您可以在函數中傳回錯誤，以防止使用者註冊、驗證、產生權杖，或進行驗證流程中調用 Lambda 觸發程序的任何其他階段。

  受管登入會傳回 Lambda 觸發在登入提示上方產生為錯誤文字的錯誤。Amazon Cognito 使用者集區 API 會使用 `{{[trigger]}} failed with error {{[error text from response]}}` 格式傳回觸發程序錯誤。最佳實務是僅在您希望使用者看到的 Lambda 函數中產生錯誤。使用類似 `print()` 的輸出方法將任何敏感或偵錯資訊記錄到 CloudWatch Logs。如需範例，請參閱 [註冊前範例：如果使用者名稱少於五個字元，則拒絕註冊](user-pool-lambda-pre-sign-up.md#aws-lambda-triggers-pre-registration-example-3)。
+ 您可以在另一個 中新增 Lambda 函數， AWS 帳戶 做為使用者集區的觸發條件。您必須使用 [CreateUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateUserPool.html) 和 [UpdateUserPool](https://docs.aws.amazon.com/) API 操作，或其在 CloudFormation 和 中的對等項目來新增跨帳戶觸發 AWS CLI。您無法在 中新增跨帳戶函數 AWS 管理主控台。
+ 當您在 Amazon Cognito 主控台中新增 Lambda 觸發程序時，Amazon Cognito 會在您的函數中新增以資源為基礎的政策，以允許您的使用者集區叫用該函數。在 Amazon Cognito 主控台外部建立 Lambda 觸發程序時，包括跨帳戶之間的函數，您必須為 Lambda 函數新增基於資源政策的許可。您新增的許可必須允許 Amazon Cognito 以代表您的使用者集區叫用函數。您可以[從 Lambda 主控台新增許可](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)或使用 Lambda [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) API 操作。

**以 Lambda 資源為基礎的政策範例**  
下列 Lambda 資源型政策範例允許 Amazon Cognito 叫用 Lambda 函數的有限功能。執行此操作時，Amazon Cognito 只能代表 `aws:SourceArn` 條件中的使用者集區和 `aws:SourceAccount` 條件中的帳戶叫用函數。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Id": "default",
      "Statement": [
          {
              "Sid": "LambdaCognitoIdpTrust",
              "Effect": "Allow",
              "Principal": {
                  "Service": "cognito-idp.amazonaws.com"
              },
              "Action": "lambda:InvokeFunction",
              "Resource": "arn:{{aws}}:lambda:{{us-east-1}}:{{111122223333}}:function:{{MyFunction}}",
              "Condition": {
                  "StringEquals": {
                      "AWS:SourceAccount": "{{111122223333}}"
                  },
                  "ArnLike": {
                      "AWS:SourceArn": "arn:{{aws}}:cognito-idp:{{us-east-1}}:{{111122223333}}:userpool/{{us-east-1_EXAMPLE}}"
                  }
              }
          }
      ]
  }
  ```

------

## 新增使用者集區 Lambda 觸發條件
<a name="triggers-working-with-lambda"></a>

**使用主控台新增使用者集區 Lambda 觸發程序**

1. 使用 [Lambda 主控台](https://console.aws.amazon.com/lambda/home)建立 Lambda 函數。如需 Lambda 函數的詳細資訊，請參閱《[AWS Lambda 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/)》。

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，然後選擇 **User Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**延伸項目**選單並尋找 **Lambda 觸發**條件。

1. 選擇 **Add a Lambda trigger** (新增 Lambda 觸發程序)。

1. 根據您要自訂的身分驗證階段，選取 Lambda 觸發程序 **Category** (類別)。

1. 選取**指派 Lambda 函數**，然後選取與使用者集區 AWS 區域 相同的函數。
**注意**  
如果您的 AWS Identity and Access Management (IAM) 登入資料具有更新 Lambda 函數的許可，Amazon Cognito 會新增 Lambda 資源型政策。使用此政策，Amazon Cognito 可以叫用您選取的函數。如果登入的憑證沒有足夠的 IAM 許可，則您必須個別更新以資源為基礎的政策。如需詳細資訊，請參閱[Lambda 觸發程序的須知事項](#important-lambda-considerations)。

1. 選擇 **Save changes** (儲存變更)。

1. 您可以使用 Lambda 主控台中的 CloudWatch 記錄您的 Lambda 函數。如需詳細資訊，請參閱[存取 Lambda 的 CloudWatch Logs](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions-logs.html)。

## 使用者集區 Lambda 觸發程序事件
<a name="cognito-user-pools-lambda-trigger-event-parameter-shared"></a>

Amazon Cognito 會將事件資訊傳遞至您的 Lambda 函數。Lambda 函數會將相同事件物件傳回 Amazon Cognito，並在回應中附上任何變更。如果您的函數在不修改的情況下傳回輸入事件，Amazon Cognito 會繼續進行預設行為。以下顯示所有 Lambda 觸發輸入事件常見的參數。如需觸發條件特定的事件語法，請檢閱本指南 區段中每個觸發條件的事件結構描述。

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

```
{
    "version": "{{string}}",
    "triggerSource": "{{string}}",
    "region": {{AWSRegion}},
    "userPoolId": "{{string}}",
    "userName": "{{string}}",
    "callerContext": 
        {
            "awsSdkVersion": "{{string}}",
            "clientId": "{{string}}"
        },
    "request":
        {
            "userAttributes": {
                "{{string}}": "{{string}}",
                ....
            }
        },
    "response": {}
}
```

------

## 使用者集區 Lambda 觸發程序的常用參數
<a name="cognito-user-pools-lambda-trigger-syntax-shared"></a>

**version**  
Lambda 函數的版本編號。

**triggerSource**  
觸發 Lambda 函數的事件名稱。如需每個 triggerSource 的說明，請參閱 [將 Lambda 觸發程序連接至使用者集區功能操作](#working-with-lambda-trigger-sources)。

**region**  
 AWS 區域 做為`AWSRegion`執行個體。

**userPoolId**  
使用者集區的 ID。

**使用者名稱**  
目前使用者的使用者名稱。

**callerContext**  
有關請求和程式碼環境的中繼資料。它包含欄位 **awsSdkVersion** 和 **clientId**。    
**awsSdkVersion**  
產生請求的 AWS SDK 版本。  
****clientId****  
使用者集區應用程式用戶端的 ID。

**請求**  
使用者 API 請求的詳細資訊。它包括下列欄位，以及觸發程序特有的任何請求參數。例如，Amazon Cognito 傳送至預先身分驗證觸發程序的事件也會包含一個 `userNotFound` 參數。您可以處理此參數的值，以便在使用者嘗試使用未註冊的使用者名稱登入時採取自訂動作。    
**userAttributes**  
一或多組使用者屬性名稱和值的鍵/值對，例如 `"email": "john@example.com"`。

**回應**  
此參數不包含原始請求中的任何資訊。您的 Lambda 函數必須將整個事件傳回給 Amazon Cognito，並將任何傳回參數新增至 `response`。若要查看函數可以包含哪些傳回參數，請參閱您要使用之觸發程序的文件。

## 用戶端中繼資料
<a name="working-with-lambda-trigger-client-metadata"></a>

您可以在 API 操作和[權杖端點](token-endpoint.md)請求中將自訂參數提交至 Lambda 觸發函數。使用用戶端中繼資料，您的應用程式可以收集請求來源環境的其他資訊。當您將用戶端中繼資料傳遞至 Lambda 函數時，他們可以處理其他資料，並在記錄或自訂身分驗證流程時使用它。用戶端中繼資料是您選擇的字串對，並以 JSON 鍵值格式設計。

**用戶端中繼資料範例使用案例**
+ 在註冊時將地理位置資料傳遞至[註冊前觸發](user-pool-lambda-pre-sign-up.md)條件，並防止從不需要的位置登入。
+ 將租戶 ID 資料傳遞至[自訂挑戰觸發條件](user-pool-lambda-challenge.md)，並向來自不同業務單位的客戶發出不同的挑戰。
+ 將使用者的字符傳遞至[字符產生前觸發](user-pool-lambda-pre-token-generation.md)程序，並產生代表 M2M 請求的委託人日誌。如需請求範例，請參閱 [具有基本授權的用戶端憑證具有 POST 內文授權的用戶端憑證](token-endpoint.md#exchanging-client-credentials-for-an-access-token-in-request-body)。

以下是將用戶端中繼資料傳遞至註冊前觸發程序的範例。

------
#### [ SignUp request ]

以下是範例 [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-ValidationData) 請求，其中包含 Amazon Cognito 傳遞給註冊前觸發條件的用戶端中繼資料。

```
POST HTTP/1.1
Host: cognito-idp.us-east-1.amazonaws.com
X-Amz-Date: 20230613T200059Z
Accept-Encoding: gzip, deflate, br
X-Amz-Target: AWSCognitoIdentityProviderService.SignUp
User-Agent: <UserAgentString>
Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>, Signature=<Signature>
Content-Length: <PayloadSizeBytes>

{
    "ClientId": "1example23456789",
    "Username": "mary_major",
    "Password": "<Password>",
    "SecretHash": "<Secret hash>",
    "ClientMetadata": { 
        "IpAddress" : "192.0.2.252",
        "GeoLocation" : "Netherlands (Kingdom of the) [NL]"
    }
    "UserAttributes": [
        {
            "Name": "name",
            "Value": "Mary"
        },
        {
            "Name": "email",
            "Value": "mary_major@example.com"
        },
        {
            "Name": "phone_number",
            "Value": "+12065551212"
        }
    ],
}
```

------
#### [ Lambda trigger input event ]

請求會導致您的註冊前函數出現以下請求內文。

```
{
    "callerContext": {
        "awsSdkVersion": "aws-sdk-unknown-unknown",
        "clientId": "1example23456789"
    },
    "region": "us-west-2",
    "request": {
        "clientMetadata": {
            "GeoLocation": "Netherlands (Kingdom of the) [NL]",
            "IpAddress": "192.0.2.252"
        },
        "userAttributes": {
            "email": "mary_major@example.com",
            "name": "Mary",
            "phone_number": "+12065551212"
        },
        "validationData": null
    },
    "response": {
        "autoConfirmUser": false,
        "autoVerifyEmail": false,
        "autoVerifyPhone": false
    },
    "triggerSource": "PreSignUp_SignUp",
    "userName": "mary_major2",
    "userPoolId": "us-west-2_EXAMPLE",
    "version": "1"
}
```

------

**machine-to-machine(M2M) 用戶端登入資料的用戶端中繼資料**  
您可以在 M2M 請求中傳遞[用戶端中繼資料](#working-with-lambda-trigger-client-metadata)。用戶端中繼資料是來自使用者或應用程式環境的其他資訊，有助於 的結果[產生權杖前 Lambda 觸發程序](user-pool-lambda-pre-token-generation.md)。在使用者主體的身分驗證操作中，您可以將用戶端中繼資料傳遞至 [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 請求內文中的權杖產生前觸發器。由於應用程式會透過對 的直接請求，為 M2M 執行產生存取字符的流程[權杖端點](token-endpoint.md)，因此具有不同的模型。在用戶端登入資料的字符請求 POST 內文中，將具有用戶端中繼資料物件 URL 編碼 (`x-www-form-urlencoded`) 的 `aws_client_metadata` 參數傳遞至字串。如需請求範例，請參閱 [具有基本授權的用戶端憑證具有 POST 內文授權的用戶端憑證](token-endpoint.md#exchanging-client-credentials-for-an-access-token-in-request-body)。以下是傳遞鍵/值對 的範例參數`{"environment": "dev", "language": "en-US"}`。

```
aws_client_metadata=%7B%22environment%22%3A%20%22dev%22,%20%22language%22%3A%20%22en-US%22%7D
```

**臨時使用者屬性： `validationData`**  
有些身分驗證操作也有 `validationData` 參數。如同用戶端中繼資料，這是將 Amazon Cognito 不會自動收集的外部資訊傳遞至 Lambda 觸發程序的機會。驗證資料欄位旨在為您的 Lambda 函數提供註冊和登入操作中的其他使用者內容。[SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html#CognitoUserPools-SignUp-request-ValidationData) 和 [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html#CognitoUserPools-AdminCreateUser-request-ValidationData) 會傳遞`validationData`至[註冊前觸發](user-pool-lambda-pre-sign-up.md)條件。[InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-ClientMetadata) 和 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ClientMetadata) `ClientMetadata` 會將輸入事件`validationData`中的 API 請求內文傳遞至身分[驗證前](user-pool-lambda-pre-authentication.md)和[遷移使用者](user-pool-lambda-migrate-user.md)觸發。

若要將 API 操作映射至它們可以傳遞用戶端中繼資料的函數，請參閱以下觸發來源區段。

## 將 API 操作連線至 Lambda 觸發程序
<a name="lambda-triggers-by-event"></a>

以下各節說明 Amazon Cognito 從使用者集區中的活動呼叫的 Lambda 觸發程序。

當您的應用程式透過 Amazon Cognito 使用者集區 API、受管登入或使用者集區端點登入使用者時，Amazon Cognito 會根據工作階段內容叫用您的 Lambda 函數。如需有關 Amazon Cognito 使用者集區 API 和使用者集區端點的詳細資訊，請參閱 [了解 API、OIDC 和受管登入頁面身分驗證](authentication-flows-public-server-side.md#user-pools-API-operations)。接下來各節中的表格描述了導致 Amazon Cognito 叫用函數的事件，以及 Amazon Cognito 在請求中包含的 `triggerSource` 字串。

**Topics**
+ [Amazon Cognito API 中的 Lambda 觸發程序](#lambda-triggers-native-users-native-api)
+ [受管登入中 Amazon Cognito 本機使用者的 Lambda 觸發條件](#lambda-triggers-native-users-hosted-UI)
+ [適用於聯合身分使用者的 Lambda 觸發程序](#lambda-triggers-for-federated-users)

### Amazon Cognito API 中的 Lambda 觸發程序
<a name="lambda-triggers-native-users-native-api"></a>

下表說明當您的應用程式建立、登入或更新本機使用者時，Amazon Cognito 可呼叫 Lambda 觸發程序的來源字串。


**Amazon Cognito API 中的本機使用者觸發程序來源**  


- ** [AdminCreateUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html) **
  - **Lambda 觸發程序:** 註冊前 / **觸發程序來源:** `PreSignUp_AdminCreateUser`
  - **Lambda 觸發程序:** 產生權杖前 / **觸發程序來源:** `TokenGeneration_NewPasswordChallenge`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_AdminCreateUser`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_AdminCreateUser`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_AdminCreateUser`

- ** [SignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_SignUp.html) **
  - **Lambda 觸發程序:** 註冊前 / **觸發程序來源:** `PreSignUp_SignUp`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_SignUp`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_SignUp`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_SignUp`

- ** [ConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmSignUp.html) [AdminConfirmSignUp](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminConfirmSignUp.html) **
  - **Lambda 觸發程序:** 貼文確認
  - **觸發程序來源:** `PostConfirmation_ConfirmSignUp`

- ** [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) **
  - **Lambda 觸發程序:** 身分驗證前 / **觸發程序來源:** `PreAuthentication_Authentication`
  - **Lambda 觸發程序:** 身分驗證後 / **觸發程序來源:** `PostAuthentication_Authentication`
  - **Lambda 觸發程序:** 定義身分驗證挑戰 / **觸發程序來源:** `DefineAuthChallenge_Authentication`
  - **Lambda 觸發程序:** 建立身分驗證挑戰 / **觸發程序來源:** `CreateAuthChallenge_Authentication`
  - **Lambda 觸發程序:** 確認驗證挑戰 / **觸發程序來源:** `VerifyAuthChallenge_Authentication`
  - **Lambda 觸發程序:** 產生權杖前 / **觸發程序來源:** `TokenGeneration_Authentication`<br />`TokenGeneration_AuthenticateDevice`<br />`TokenGeneration_RefreshTokens`
  - **Lambda 觸發程序:** 遷移使用者 / **觸發程序來源:** `UserMigration_Authentication`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_Authentication`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_AccountTakeOverNotification`<br />`CustomEmailSender_Authentication`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_Authentication`

- ** [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) **
  - **Lambda 觸發程序:** 身分驗證後 / **觸發程序來源:** `PostAuthentication_Authentication`
  - **Lambda 觸發程序:** 定義身分驗證挑戰 / **觸發程序來源:** `DefineAuthChallenge_Authentication`
  - **Lambda 觸發程序:** 建立身分驗證挑戰 / **觸發程序來源:** `CreateAuthChallenge_Authentication`
  - **Lambda 觸發程序:** 確認驗證挑戰 / **觸發程序來源:** `VerifyAuthChallenge_Authentication`
  - **Lambda 觸發程序:** 產生權杖前 / **觸發程序來源:** `TokenGeneration_Authentication`<br />`TokenGeneration_AuthenticateDevice`<br />`TokenGeneration_RefreshTokens`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_Authentication`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_AccountTakeOverNotification`<br />`CustomEmailSender_Authentication`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_Authentication`

- ** [ForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ForgotPassword.html) **
  - **Lambda 觸發程序:** 遷移使用者 / **觸發程序來源:** `UserMigration_ForgotPassword`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_ForgotPassword`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_ForgotPassword`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_ForgotPassword`

- ** [ConfirmForgotPassword](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ConfirmForgotPassword.html) **
  - **Lambda 觸發程序:** 貼文確認
  - **觸發程序來源:** `PostConfirmation_ConfirmForgotPassword`

- ** [UpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UpdateUserAttributes.html) [AdminUpdateUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminUpdateUserAttributes.html) **
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_UpdateUserAttribute`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_UpdateUserAttribute`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_UpdateUserAttribute`

- ** [VerifyUserAttributes](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_VerifyUserAttributes.html) **
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_VerifyUserAttribute`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_VerifyUserAttribute`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_VerifyUserAttribute`

- ** [GetTokensFromRefreshToken](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetTokensFromRefreshToken.html) **
  - **Lambda 觸發程序:** 產生權杖前
  - **觸發程序來源:** `TokenGeneration_Authentication`



### 受管登入中 Amazon Cognito 本機使用者的 Lambda 觸發條件
<a name="lambda-triggers-native-users-hosted-UI"></a>

下表說明當本機使用者使用受管登入登入使用者集區時，Amazon Cognito 可以叫用之 Lambda 觸發條件的來源字串。


**受管登入中的本機使用者觸發來源**  


- **`/signup`**
  - **Lambda 觸發程序:** 註冊前 / **觸發程序來源:** `PreSignUp_SignUp`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_SignUp`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_SignUp`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_SignUp`

- **`/confirmuser`**
  - **Lambda 觸發程序:** 貼文確認
  - **觸發程序來源:** `PostConfirmation_ConfirmSignUp`

- **`/login`**
  - **Lambda 觸發程序:** 身分驗證前 / **觸發程序來源:** `PreAuthentication_Authentication`
  - **Lambda 觸發程序:** 產生權杖前 / **觸發程序來源:** `TokenGeneration_Authentication`<br />`TokenGeneration_AuthenticateDevice`<br />`TokenGeneration_RefreshTokens`
  - **Lambda 觸發程序:** 遷移使用者 / **觸發程序來源:** `UserMigration_Authentication`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_Authentication`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_AccountTakeOverNotification`<br />`CustomEmailSender_Authentication`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_Authentication`

- **`/forgotpassword`**
  - **Lambda 觸發程序:** 遷移使用者 / **觸發程序來源:** `UserMigration_ForgotPassword`
  - **Lambda 觸發程序:** 自訂訊息 / **觸發程序來源:** `CustomMessage_ForgotPassword`
  - **Lambda 觸發程序:** 自訂電子郵件寄件者 / **觸發程序來源:** `CustomEmailSender_ForgotPassword`
  - **Lambda 觸發程序:** 自訂簡訊寄件者 / **觸發程序來源:** `CustomSMSSender_ForgotPassword`

- **`/confirmforgotpassword`**
  - **Lambda 觸發程序:** 貼文確認
  - **觸發程序來源:** `PostConfirmation_ConfirmForgotPassword`



### 適用於聯合身分使用者的 Lambda 觸發程序
<a name="lambda-triggers-for-federated-users"></a>

您可以使用以下 Lambda 觸發程序，為使用聯合身分提供者登入的使用者自訂使用者集區工作流程。

**注意**  
聯合身分使用者可以使用受管登入來登入，或者您可以對 產生請求[授權端點](authorization-endpoint.md)，以靜音方式將他們重新導向至身分提供者登入頁面。您不能使用 Amazon Cognito 使用者集區 API 登入聯合身分使用者。


**聯合身分使用者觸發程序來源**  


- **首次登入**
  - **Lambda 觸發程序:** 註冊前 / **觸發程序來源:** `PreSignUp_ExternalProvider`
  - **Lambda 觸發程序:** 貼文確認 / **觸發程序來源:** `PostConfirmation_ConfirmSignUp`
  - **Lambda 觸發程序:** 產生權杖前 / **觸發程序來源:** `TokenGeneration_HostedAuth`

- **後續登入**
  - **Lambda 觸發程序:** 身分驗證前 / **觸發程序來源:** `PreAuthentication_Authentication`
  - **Lambda 觸發程序:** 身分驗證後 / **觸發程序來源:** `PostAuthentication_Authentication`
  - **Lambda 觸發程序:** 產生權杖前 / **觸發程序來源:** `TokenGeneration_HostedAuth`



聯合身分登入不會叫用使用者集區中的任何 [自訂身分驗證挑戰 Lambda 觸發程序](user-pool-lambda-challenge.md)、[遷移使用者 Lambda 觸發程序](user-pool-lambda-migrate-user.md)、[自訂訊息 Lambda 觸發程序](user-pool-lambda-custom-message.md) 或 [自訂寄件者 Lambda 觸發程序](user-pool-lambda-custom-sender-triggers.md)。

## 將 Lambda 觸發程序連接至使用者集區功能操作
<a name="working-with-lambda-trigger-sources"></a>

每個 Lambda 觸發程序都在您的使用者集區中扮演一個功能角色。例如，觸發程序可以修改您的註冊流程，或新增自訂身分驗證挑戰。Amazon Cognito 傳送至 Lambda 函數的事件可反映組成該功能角色的多個動作之一。例如，Amazon Cognito 會在您的使用者註冊以及您建立使用者時，叫用預先註冊觸發程序。相同功能角色在這些不同情況中都有自己的 `triggerSource` 值。Lambda 函數可以根據呼叫它的操作，以不同的方式處理傳入事件。

當事件對應於觸發程序來源時，Amazon Cognito 也會叫用所有指派的函數。例如，當使用者登入您指派了遷移使用者和預先身分驗證觸發程序的使用者集區時，他們會同時啟動兩者。


**註冊、確認和登入 (身分驗證) 觸發程序**  

| 觸發條件 | triggerSource 值 | 事件 | 
| --- | --- | --- | 
| 註冊前 | PreSignUp\_SignUp | 註冊前。 | 
| 註冊前 | PreSignUp\_AdminCreateUser | 註冊前 (當管理員建立新使用者時)。 | 
| 註冊前 | PreSignUp\_ExternalProvider | 外部身分提供者註冊前。 | 
| 貼文確認 | PostConfirmation\_ConfirmSignUp | 註冊後確認。 | 
| 貼文確認 | PostConfirmation\_ConfirmForgotPassword | 忘記密碼後確認。 | 
| 身分驗證前 | PreAuthentication\_Authentication | 身分驗證前。 | 
| 身分驗證後 | PostAuthentication\_Authentication | 身分驗證後。 | 


**自訂身分驗證挑戰觸發程序**  

| 觸發條件 | triggerSource 值 | 事件 | 
| --- | --- | --- | 
| 定義身分驗證挑戰 | DefineAuthChallenge\_Authentication | 定義驗證挑戰。 | 
| 建立身分驗證挑戰 | CreateAuthChallenge\_Authentication | 建立驗證挑戰。 | 
| 確認驗證挑戰 | VerifyAuthChallengeResponse\_Authentication | 確認驗證挑戰回應。 | 


**聯合觸發**  

| 觸發條件 | triggerSource 值 | 事件 | 
| --- | --- | --- | 
| 傳入聯合 | InboundFederation\_ExternalProvider | 傳入聯合。 | 


**產生權杖前觸發程序**  

| 觸發條件 | triggerSource 值 | 事件 | 
| --- | --- | --- | 
| 產生權杖前 | TokenGeneration\_HostedAuth |  Amazon Cognito 會從受管登入頁面驗證使用者。 | 
| 產生權杖前 | TokenGeneration\_Authentication | 使用者身分驗證或權杖重新整理完成。 | 
| 產生權杖前 | TokenGeneration\_NewPasswordChallenge | 管理員建立使用者。當使用者必須變更臨時密碼時，Amazon Cognito 會叫用此功能。 | 
| 產生權杖前 | TokenGeneration\_AuthenticateDevice | 使用者裝置的身分驗證結束時。 | 
| 產生權杖前 | TokenGeneration\_RefreshTokens | 使用者嘗試重新整理身分和存取權杖時。 | 


**遷移使用者觸發程序**  

| 觸發條件 | triggerSource 值 | 事件 | 
| --- | --- | --- | 
| 使用者遷移 | UserMigration\_Authentication | 在登入時的使用者遷移。 | 
| 使用者遷移 | UserMigration\_ForgotPassword | 忘記密碼流程時的使用者遷移。 | 


**自訂訊息觸發程序**  

| 觸發條件 | triggerSource 值 | 事件 | 
| --- | --- | --- | 
| 自訂訊息 | CustomMessage\_SignUp | 當使用者在使用者集區註冊時的自訂訊息。 | 
| 自訂訊息 | CustomMessage\_AdminCreateUser | 當您以管理員身分建立使用者，而且 Amazon Cognito 向這些使用者發送臨時密碼時的自訂訊息。 | 
| 自訂訊息 | CustomMessage\_ResendCode | 當現有使用者請求新確認代碼時的自訂訊息。 | 
| 自訂訊息 | CustomMessage\_ForgotPassword | 當使用者請求密碼重設時的自訂訊息。 | 
| 自訂訊息 | CustomMessage\_UpdateUserAttribute | 當使用者變更其電子郵件地址或電話號碼，而且 Amazon Cognito 傳送驗證碼時的自訂訊息。 | 
| 自訂訊息 | CustomMessage\_VerifyUserAttribute | 當使用者新增電子郵件地址或電話號碼，而且 Amazon Cognito 傳送驗證碼的自訂訊息。 | 
| 自訂訊息 | CustomMessage\_Authentication | 當已設定簡訊 MFA 的使用者登入時的自訂訊息。 | 


**自訂寄件者觸發條件**  

| 觸發條件 | triggerSource 值 | 事件 | 
| --- | --- | --- | 
| 自訂寄件者 | `CustomEmailSender_SignUp`<br />`CustomSmsSender_SignUp` | 當使用者在您的使用者集區中註冊時。 | 
| 自訂寄件者 | `CustomEmailSender_AdminCreateUser`<br />`CustomSmsSender_AdminCreateUser` | 當您以管理員身分建立使用者時，Amazon Cognito 會傳送臨時密碼給他們。 | 
| 自訂寄件者 | `CustomEmailSender_ForgotPassword`<br />`CustomSmsSender_ForgotPassword` | 當您的使用者請求重設密碼時。 | 
| 自訂寄件者 | `CustomEmailSender_UpdateUserAttribute`<br />`CustomSmsSender_UpdateUserAttribute` | 當使用者變更其電子郵件地址或電話號碼，且 Amazon Cognito 傳送驗證碼時。 | 
| 自訂寄件者 | `CustomEmailSender_VerifyUserAttribute`<br />`CustomSmsSender_VerifyUserAttribute` | 當使用者新增電子郵件地址或電話號碼，且 Amazon Cognito 傳送驗證碼時。 | 
| 自訂寄件者 | `CustomEmailSender_Authentication`<br />`CustomSmsSender_Authentication` | 已設定 SMS 或電子郵件 MFA 或 OTP 的使用者登入時。 | 
| 自訂寄件者 | CustomEmailSender\_AccountTakeOverNotification | 當您的威脅防護設定對使用者的登入嘗試採取自動動作，且風險層級的動作包含通知。 | 