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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自定义电子邮件 Lambda 触发器

这些区域有:CustomEmailSender触发器,以使第三方提供商能够从 Lambda 函数代码中向用户发送电子邮件通知。使用此触发器涉及五个主要步骤:

注意

这些区域有:CustomEmailSender触发器在 Amazon Cognito 控制台中不可用。

  • 创建 Lambda 函数CustomEmailSender。Amazon Cognito 使用Amazon Encryption SDK来加密密码(临时密码或授权码)。

  • 创建加密密钥Amazon KMS。此密钥将用于加密 Amazon Cognito 生成的临时密码和授权码。然后,您可以在自定义发件人 Lambda 函数中解密这些密钥,以纯文本形式将它们发送给最终用户。

  • 授予 Amazon Cognito 服务主要人身份识别-idp.amazonaws.com 访问权限,以调用 Lambda 函数。

  • 编辑 Lambda 函数中的代码以使用客户发件人或第三方提供商。

  • 更新现有用户池以添加自定义发件人 Lambda 触发器。

重要

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

启用CustomEmailSenderLambda 触发器

您可以启用CustomEmailSender使用 Lambda 函数触发器。

第 1 步:创建 Lambda 函数

创建 Lambda 函数CustomEmailSender触发器。Amazon Cognito 使用Amazon加密开发工具包来加密密码(临时密码或授权码)。

第 2 步:创建加密密钥Amazon KMS

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

第 3 步:授予 Amazon 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适用于 JavaScript 的加密开发工具包。您也可以完成以下步骤来更新 Lambda 软件包。

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

  2. 解压缩程序包。

  3. 添加Amazon Encryption SDK添加到程序包。例如,如果您使用的是 Node.js,则添加node_modules目录,并包含来自 @aws-密码/客户端节点的库。

  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 示例展示了如何使用CustomEmailSenderLambda 函数。

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 注册后发送确认代码。
CustomEmailSender_ResendCode 向新用户重新发送临时密码。
CustomEmailSender_ForgotPassword 向现有用户重新发送确认代码。
CustomEmailSender_UpdateUserAttribute 当用户的电子邮件发生更改时,此触发器自动向用户发送验证码。不可用于其他属性。
CustomEmailSender_VerifyUserAttribute 当用户针对新的电子邮件地址手动请求验证码时,此触发器向用户发送验证码。
CustomEmailSender_AdminCreateUser 向新用户发送临时密码。
CustomEmailSender_AccountTakeOverNotification 当检测到有人试图接管他们的帐户时,此触发器会向客户发送通知。