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

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

自定义发件人 Lambda 触发器

Lambda 触发器 CustomEmailSenderCustomSMSSender 支持在用户池中使用第三方电子邮件和短信通知。您可以选择 SMS 和电子邮件提供商,通过 Lambda 函数代码向用户发送通知。当 Amazon Cognito 向用户发送邀请、MFA 代码、确认码、验证码或临时密码时,这些事件会激活您配置的 Lambda 函数。Amazon Cognito 将代码和临时密码(密钥)发送到您激活的 Lambda 函数。Amazon Cognito 使用 Amazon KMS 客户管理的密钥对这些机密进行加密,然后. Amazon Encryption SDK Amazon Encryption SDK 是一个客户端加密库,可帮助您加密和解密通用数据。

CustomEmailSender

Amazon Cognito 调用此触发器向用户发送电子邮件通知。

自定义SMSSender

Amazon Cognito 调用此触发器向用户发送 SMS 通知。

加密概念

Amazon Cognito 不会在发送给自定义发件人触发器的事件中以明文形式发送用户的代码。Lambda 函数必须解密事件中的代码。以下概念是加密架构,您的函数必须使用该架构来获取可以传递给用户的代码。

Amazon KMS

Amazon KMS 是一项用于创建和控制 Amazon KMS 密钥的托管服务。这些密钥加密您的数据。有关更多信息,请参阅什么是 Amazon Key Management Service?

KMS 密钥

KMS 密钥是加密密钥的逻辑表示形式。KMS 密钥包含元数据,如密钥 ID、创建日期、描述和密钥状态。KMS 密钥还包含用于加密和解密数据的密钥材料。有关更多信息,请参阅 Amazon KMS 密钥

对称 KMS 密钥

对称 KMS 密钥是一个 256 位加密密钥,它不会退出 Amazon KMS 而不加密。要使用对称 KMS 密钥,必须调用 Amazon KMS。Amazon Cognito 使用对称密钥。加密和解密使用同一密钥。有关更多信息,请参阅对称 KMS 密钥

关于自定义发件人 Lambda 触发器的注意事项

  • 要配置用户池以使用这些 Lambda 触发器,您可以使用 Amazon CLI 或开发工具包。无法从 Amazon Cognito 控制台进行这些配置。

    UpdateUserPool操作设置 Lambda 配置。对此操作的请求需要用户池的所有参数以及要更改的参数。如果您没有提供所有相关参数,Amazon Cognito 会将任何缺失参数的值设置为其原定设置。如下面的 Amazon CLI 示例所示,包括您要添加到用户池或保留在用户池中的所有 Lambda 函数的条目。有关更多信息,请参阅 更新用户池和应用程序客户端配置

    #Send this parameter in an 'aws cognito-idp update-user-pool' CLI command, including any existing #user pool configurations. This snippet also includes a pre sign-up trigger for syntax reference. The pre sign-up trigger #doesn't have a role in custom sender triggers. --lambda-config "PreSignUp=lambda-arn, \ CustomSMSSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \ CustomEmailSender={LambdaVersion=V1_0,LambdaArn=lambda-arn}, \ KMSKeyID=key-id"

    对于使用以下LambdaConfig代码段的 JSON 正文UpdateUserPool的请求,分配自定义 SMS 和电子邮件发送器函数。

    "LambdaConfig": { "KMSKeyID": "arn:aws:kms:us-east-1:111122223333:key/a6c4f8e2-0c45-47db-925f-87854bc9e357", "CustomEmailSender": { "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction", "LambdaVersion": "V1_0" }, "CustomSMSSender": { "LambdaArn": "arn:aws:lambda:us-east-1:111122223333:function:MyFunction", "LambdaVersion": "V1_0" }
  • 要使用update-user-pool Amazon CLI 命令移除自定义发送器 Lambda 触发器,请省略CustomSMSSenderCustomEmailSender参数--lambda-config,并包含您要在用户池中使用的所有其他触发器。

    要使用 UpdateUserPool API 请求删除自定义发件人 Lambda 触发器,请在包含其余用户群体配置的请求正文中省略 CustomSMSSenderCustomEmailSender 参数。

  • Amazon Cognito HTML 会转义用户临时密码中的保留字符,例如 <&lt;)和 &gt;>)等。这些字符可能出现在 Amazon Cognito 发送到您的自定义电子邮件发件人函数的临时密码中,但不会出现在临时验证码中。要发送临时密码,您的 Lambda 函数在解密密码之后必须取消对这些字符的转义,然后再将消息发送给您的用户。

激活自定义发件人 Lambda 触发器

要使用自定义逻辑向用户池发送短信或电子邮件,请设置自定义发件人触发器。以下步骤会将自定义 SMS 触发器和/或自定义电子邮件触发器分配给您的用户群体。添加自定义发件人触发器后,Amazon Cognito 始终将用户属性(包括电话号码和一次性代码)发送到您的 Lambda 函数,而不是发送短信或电子邮件的默认行为。

  1. 在 Amazon Key Management Service (Amazon KMS) 中创建对称加密密钥。Amazon Cognito 生成密钥(临时密码、验证码、一次性身份验证密码和确认码),然后使用此 KMS 密钥对密钥进行加密。然后,您可以在 Lambda 函数中使用解密 API 操作来解密这些密钥,并以明文形式将其发送给用户。Amazon Encryption SDK是在函数中进行 Amazon KMS 操作的有用工具。

  2. 创建或更新您的用户池的 IAM 委托人会针对 Amazon Cognito 用于加密代码的 KMS 密钥创建一次性授权。向该委托人授予您的 KMS 密钥的CreateGrant权限。为了使此示例 KMS 密钥策略生效,更新用户池的管理员必须使用 IAM 角色的假设角色会话登录。arn:aws:iam::111222333444:role/my-example-administrator-role

    将针对您的环境修改的以下基于资源的策略应用于您的 KMS 密钥。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/my-example-administrator-role" }, "Action": "kms:CreateGrant", "Resource": "arn:aws:kms:us-west-2:111122223333:key/1example-2222-3333-4444-999example", "Condition": { "StringEquals": { "kms:EncryptionContext:userpool-id": "us-west-2_EXAMPLE" } } }, { "Sid": "Allow Lambda to decrypt", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/my-lambda-function-role" }, "Action": "kms:Decrypt", "Resource": "*" }] }
  3. 为自定义发件人触发器创建 Lambda 函数。Amazon Cognito 使用 Amazon Encryption SDK 加密密钥、临时密码和授权用户 API 请求的代码。

    1. 分配至少具有您的 KMS 密钥kms:Decrypt权限的 Lambda 执行角色

    2. 编写 Lambda 函数代码来发送您的消息。你的函数的输入事件包含一个秘密。在您的函数中,使用解密密密钥 Amazon Encryption SDK 并处理所有相关的元数据。然后将代码、您自己的自定义消息和目标电话号码发送到传送消息的自定义 API。

    3. 将 Amazon Encryption SDK 添加到您的 Lambda 函数中。有关更多信息,请参阅 Amazon Encryption SDK 编程语言。要更新 Lambda 包,请完成以下步骤:

      1. 在 Amazon Web Services Management Console中将您的 Lambda 函数作为.zip 文件导出。

      2. 打开您的函数并添加 Amazon Encryption SDK. 有关更多信息和下载链接,请参阅 Amazon Encryption SDK Developer Guide(《Crypto SDK 开发人员指南》)中的 Amazon Encryption SDK 编程语言

      3. 压缩您的函数及 SDK 依赖项,然后将函数上传到 Lambda。有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的将 Lambda 函数部署为 .zip 文件归档

  4. 授予 Amazon Cognito 服务主体 cognito-idp.amazonaws.com 访问权限,以调用 Lambda 函数。

    以下 Amazon CLI 命令授予 Amazon Cognito 调用您的 Lambda 函数的权限:

    aws lambda add-permission --function-name lambda_arn --statement-id "CognitoLambdaInvokeAccess" --action lambda:InvokeFunction --principal cognito-idp.amazonaws.com
  5. 使用添加自定义发送器 Lambda 触发器的LambdaConfig参数生成 UpdateUserPoolAPI 请求。您无法在 Amazon Cognito 控制台中添加此类触发器。自定义发件人触发器需要LambdaConfig参数为KMSKeyIDCustomSMSSenderCustomEmailSender(或两者)。