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

自定义 SMS 发件人 Lambda 触发器

Amazon Cognito 在 Lambda 函数代码中调用 CustomSMSSender 触发器,使第三方提供商可以向您的用户发送 SMS 通知。要使用此触发器,请执行以下步骤:

注意

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

  1. CustomSMSSender 创建 Lambda 函数

  2. 在 Amazon KMS 中创建加密密钥。

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

  4. 编辑 Lambda 函数中的代码,包括第三方提供商。

  5. 更新您的用户池,添加自定义触发器。

重要

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

启用 CustomSMSSender Lambda 触发器

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

步骤 1:创建 Lambda 函数

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

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

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

步骤 3:授予 Amazon Cognito 服务委托人 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 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 触发器

更新用户池,添加 CustomSMSSender 触发器。

代码示例

#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 示例演示了如何使用 CustomSMSSender 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 == '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 用户注册,Amazon Cognito 随即发送欢迎消息。
CustomSMSSender_ResendCode 用户请求更换代码以重置其密码。
CustomSMSSender_ForgotPassword 用户请求代码以重置其密码。
CustomSMSSender_UpdateUserAttribute 用户更新电子邮件地址或电话号码属性,而 Amazon Cognito 将发送代码用于验证该属性。
CustomSMSSender_VerifyUserAttribute 用户创建新电子邮件地址或电话号码属性,而 Amazon Cognito 将发送代码用于验证该属性。
CustomSMSSender_Authentication 配置了 SMS MFA 的用户登录。
CustomSMSSender_AdminCreateUser 您在用户池中创建新用户,而 Amazon Cognito 向其发送临时密码。