自定义 SMS 发件人 Lambda 触发器
Amazon Cognito 在 Lambda 函数代码中调用 CustomSMSSender
触发器,使第三方提供商可以向您的用户发送 SMS 通知。要使用此触发器,请执行以下步骤:
CustomSMSSender
触发器在 Amazon Cognito 控制台中不可用。
-
为
CustomSMSSender
创建 Lambda 函数 -
在 Amazon KMS 中创建加密密钥。
-
授予 Amazon Cognito 服务委托人 cognito-idp.amazonaws.com 访问权限,以调用 Lambda 函数。
-
编辑 Lambda 函数中的代码,包括第三方提供商。
-
更新您的用户池,添加自定义触发器。
为了提高安全性,如果为用户池配置了 CustomEmailSender
或 CustomSMSSender
,您必须配置对称 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 包,请完成以下步骤:
-
从控制台导出 Lambda 函数包。
-
解压缩程序包。
-
将 Amazon Encryption SDK 添加到该包。例如,如果您使用的是 Node.js,请添加
node_modules
目录,并包含 @aws-crypto/client-node 中的库。 -
重新创建包。
-
从修改后的目录更新 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 向其发送临时密码。 |