自定义电子邮件 Lambda 触发器 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

自定义电子邮件 Lambda 触发器

Amazon Cognito 调用 CustomEmailSender 触发器,这样第三方提供商可以在 Lambda 函数代码中向用户发送电子邮件通知。如下所示使用此触发器:

注意

CustomEmailSender 触发器在 Amazon Cognito 控制台中不可用。

  1. CustomEmailSender 创建 Lambda 函数 Amazon Cognito 使用 Amazon Encryption SDK 加密密钥(临时密码或授权代码)。

  2. 在 Amazon KMS 中创建加密密钥。Amazon Cognito 使用此密钥加密 Amazon Cognito 生成的临时密码和授权代码。然后,您可以在自定义发件人 Lambda 函数中解密这些密钥,以明文形式将其发送给用户。

  3. 授予 Amazon Cognito 服务委托人 cognito-idp.amazonaws.com 权限,以调用 Lambda 函数。

  4. 编写代码,使 Lambda 函数使用自定义发件人或第三方提供商。

  5. 更新用户池,使其使用自定义发件人 Lambda 触发器。

重要

为用户池配置 CustomEmailSenderCustomSMSSender 时,在 CustomEmailSenderCustomSMSSender 时,您必须配置对称 Amazon KMS 密钥以提高安全性。Amazon Cognito 使用您配置的 KMS 密钥加密代码或临时密码。Amazon Cognito 将 base64 编码的密文发送到您的 Lambda 函数。有关更多信息,请参阅对称 KMS 密钥

激活 CustomEmailSender Lambda 触发器

CustomEmailSender 触发器使用 Lambda 函数。

步骤 1:创建 Lambda 函数

CustomEmailSender 触发器创建 Lambda 函数。Amazon Cognito 使用 Amazon Encryption SDK 加密密钥(临时密码或授权代码)。

步骤 2:在 Amazon KMS 中创建加密密钥

在 Amazon KMS 中创建加密密钥。Amazon Cognito 使用此密钥加密 Amazon Cognito 生成的临时密码和授权代码。然后,您可以在自定义发件人 Lambda 函数中解密这些密钥,以明文形式将其发送给用户。

步骤 3:授予 Amazon Cognito 服务委托人 cognito-idp.amazonaws.com 权限,以调用 Lambda 函数。

使用以下 命令:

aws lambda add-permission --function-name lambda_arn --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com

步骤 4:编辑代码以使用自定义发件人

Amazon Cognito 使用 Amazon Encryption SDK 加密密钥(临时密码和授权代码),然后再将密钥发送到自定义发件人 Lambda 函数。请先解密这些密钥,然后再将它们发送给用户。您可以选择自定义提供商来发送电子邮件。要将 Amazon Encryption SDK 与您的 Lambda 函数结合使用,您需要将该 SDK 与函数打包在一起。有关信息,请参阅安装 Amazon Encryption SDK for JavaScript。您也可以如下所示更新 Lambda 包:

  1. 从控制台导出 Lambda 函数包。

  2. 解压缩程序包。

  3. 将 Amazon Encryption SDK 添加到该包。例如,如果您使用的是 Node.js,请添加 node_modules 目录,并包含 @aws-crypto/client-node 中的库。

  4. 重新创建包。

  5. 从修改后的目录更新 Lambda 函数代码。

步骤 5:更新用户池,添加自定义发件人 Lambda 触发器

更新用户池以添加 CustomEmailSender 触发器。

#Send the parameter to update-user-pool along with any existing user pool configurations. --lambda-config "CustomEmailSender={LambdaVersion=V1_0,LambdaArn= lambda-arn },KMSKeyID= key-id"

以下 Node.js 示例演示了如何使用 CustomEmailSender Lambda 函数。

const AWS = require('aws-sdk'); const b64 = require('base64-js'); const encryptionSdk = require('@aws-crypto/client-node'); #Configure the encryption SDK client with the KMS key from the environment variables. const { encrypt, decrypt } = encryptionSdk.buildClient(encryptionSdk.CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT); const generatorKeyId = process.env.KEY_ALIAS; const keyIds = [ process.env.KEY_ID ]; const keyring = new encryptionSdk.KmsKeyringNode({ generatorKeyId, keyIds }) exports.handler = async (event) => { #Decrypt the secret code using encryption SDK. let plainTextCode; if(event.request.code){ const { plaintext, messageHeader } = await decrypt(keyring, b64.toByteArray(event.request.code)); plainTextCode = plaintext } #PlainTextCode now has the decrypted secret. if(event.triggerSource == 'CustomEmailSender_SignUp'){ #Send email to end-user using custom or 3rd party provider. #Include temporary password in the email. }else if(event.triggerSource == 'CustomEmailSender_ResendCode'){ }else if(event.triggerSource == 'CustomEmailSender_ForgotPassword'){ }else if(event.triggerSource == 'CustomEmailSender_UpdateUserAttribute'){ }else if(event.triggerSource == 'CustomEmailSender_VerifyUserAttribute'){ }else if(event.triggerSource == 'CustomEmailSender_AdminCreateUser'){ }else if(event.triggerSource == 'CustomEmailSender_AccountTakeOverNotification'){ } return; };

自定义电子邮件发件人 Lambda 触发器源

下表显示了 Lambda 代码中自定义电子邮件触发器源的触发事件。

TriggerSource value 触发事件
CustomEmailSender_SignUp 用户注册,Amazon Cognito 随即发送欢迎消息。
CustomEmailSender_ResendCode 用户请求更换代码以重置其密码。
CustomEmailSender_ForgotPassword 用户请求代码以重置其密码。
CustomEmailSender_UpdateUserAttribute 用户更新电子邮件地址或电话号码属性,而 Amazon Cognito 将发送代码用于验证该属性。
CustomEmailSender_VerifyUserAttribute 用户创建新电子邮件地址或电话号码属性,而 Amazon Cognito 将发送代码用于验证该属性。
CustomEmailSender_AdminCreateUser 您在用户池中创建新用户,而 Amazon Cognito 向其发送临时密码。
CustomEmailSender_AccountTakeOverNotification Amazon Cognito 检测到接管用户账户的尝试并向用户发送通知。