我想使用我所在国家/地区的本地提供商以短信形式向用户手机发送验证码,而不使用 AWS SNS。
我在 CustomMessage 中有一个触发器,并且 lambda 函数工作正常。但我的问题是我无法在 lambda 函数中找到验证码。只能找到 codeParameter,即 {####}。
那么如何获取验证码并使用本地提供商发送呢?
在这种场景下,您需要实现自定义身份验证。因为 Cognito 不会与您分享这个秘密。我们使用 Cognito 自定义身份验证机制实现了自定义身份验证场景。
您可以使用DefineAuth、CreateAuth和VerifyAuth触发器来实现。请参考以下流程。
https://aws.amazon.com/blogs/mobile/customizing-your-user-pool-authentication-flow/
对于那些寻找替代解决方案的人,我建议使用 Cognito 的自定义短信发送器触发器。当您使用自定义短信触发器时,您不必实现自定义身份验证机制。
自定义短信发送器触发器将使您能够获取加密的代码参数,然后您可以使用为用户池配置的 KMS 密钥对其进行解密。
您可以遵循的步骤:
参考资料:
Terraform 目前不支持自定义短信发送器触发器。关于此有一个未决问题
我只是想我应该对此进行补充,除了使用用户池身份验证流程(需要您创建和开发 3 个 Lambda 函数)之外,您还可以使用自定义电子邮件发送器或 SMS 发送器(到目前为止我只使用过电子邮件发送器),这需要 1 个 Lambda功能和 1 个 KMS 对称密钥。
此方法要求您创建一个 KMS 密钥,Cognito 将使用它来加密发送到您的自定义电子邮件/短信发送者 Lambda 函数的代码,该函数接收代码并使用 KMS 密钥 API 对其进行解码,然后它可以发送使用您想要的任何形式(SMS、SES 或其他自定义电子邮件)将代码发送给用户。我刚刚完成配置此方法,它工作完美,将在下面分享我使用的资源。
请注意,此方法有点困难,因为它容易出错,因为它需要您与命令行进行大量交互。您将需要 AWS SDK,但我使用云 shell 环境来执行所有需要 SDK 的命令。
我使用的资源如下。
https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-email-sender.html
https://medium.com/globant/aws-cognito-send-email-by-using-a-third-party-provider-99cb9d3470
https://github.com/maximivanov/cognito-custom-email-sender-lambda/tree/main/terraform
谢谢,只是知道您肯定会遇到 Cognito 用户池不调用您 Lambda 函数的问题,在这种情况下请确保您密切关注资源,并且很可能是您的 Cognito 设置未正确完成,在这种情况下请遵循此- Cognito 不会调用 CustomSMSSender 中的 Lambda 函数。 如果您需要更多信息,请告诉我。