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

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

自定义 SMS 发件人 Lambda 触发器

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

注意

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

  • 创建 Lambda 函数CustomSMSSender

  • 创建加密密钥Amazon KMS。

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

  • 编辑 Lambda 函数中的代码以包含第三方提供程序。

  • 更新您的用户池以添加自定义触发器。

重要

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

启用CustomSMSSenderLambda 触发器

您可以启用CustomSMSSender触 Lambda 器。

第 1 步:创建 Lambda 函数

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

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

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

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

使用以下命令授予 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 触发器

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

代码示例

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

下面的 Node.js 示例展示了如何使用CustomSMSSenderLambda 函数。

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 == 'CustomSMSSender_SignUp'){ #Send sms to end-user using custom or 3rd party provider. #Include temporary password in the email. }else if(event.triggerSource == 'CustomSMSSender_ResendCode'){ }else if(event.triggerSource == 'CustomSMSSender_ForgotPassword'){ }else if(event.triggerSource == 'CustomSMSSender_UpdateUserAttribute'){ }else if(event.triggerSource == 'CustomSMSSender_VerifyUserAttribute'){ }else if(event.triggerSource == 'CustomSMSSender_AdminCreateUser'){ }else if(event.triggerSource == 'CustomSMSSender_AccountTakeOverNotification'){ } return; };

自定义 SMS 发件人 Lambda 触发源

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

TriggerSource value 触发事件
CustomSMSSender_SignUp 注册后发送确认代码的自定义消息。
CustomSMSSender_ResendCode 向新用户发送临时密码。
CustomSMSSender_ForgotPassword 向现有用户重新发送确认代码。
CustomSMSSender_UpdateUserAttribute 当用户的电子邮件或电话号码发生更改时,此触发器自动向用户发送验证码。此属性不可用于其他属性。
CustomSMSSender_VerifyUserAttribute 当用户针对新的电话号码手动请求验证码时,此触发器向用户发送验证码。
CustomSMSSender_Authentication 在身份验证过程中发送 MFA 代码。
CustomSMSSender_AdminCreateUser 向新用户发送临时密码。