在 lambda 中获取 Cognito 验证码以使用本地提供商发送短信

问题描述 投票:0回答:3

我想使用我所在国家/地区的本地提供商以短信形式向用户手机发送验证码,而不使用 AWS SNS。

我在 CustomMessage 中有一个触发器,并且 lambda 函数工作正常。但我的问题是我无法在 lambda 函数中找到验证码。只能找到 codeParameter,即 {####}。

那么如何获取验证码并使用本地提供商发送呢?

amazon-web-services aws-lambda aws-sdk amazon-cognito amazon-sns
3个回答
4
投票

在这种场景下,您需要实现自定义身份验证。因为 Cognito 不会与您分享这个秘密。我们使用 Cognito 自定义身份验证机制实现了自定义身份验证场景。

您可以使用DefineAuth、CreateAuth和VerifyAuth触发器来实现。请参考以下流程。

https://aws.amazon.com/blogs/mobile/customizing-your-user-pool-authentication-flow/


1
投票

对于那些寻找替代解决方案的人,我建议使用 Cognito 的自定义短信发送器触发器。当您使用自定义短信触发器时,您不必实现自定义身份验证机制。

自定义短信发送器触发器将使您能够获取加密的代码参数,然后您可以使用为用户池配置的 KMS 密钥对其进行解密。

您可以遵循的步骤:

  1. 创建 KSM 密钥。
  2. 创建自定义短信发送器 lambda 函数。这个函数应该能够执行kms:decrypt操作。
  3. 在 lambda 函数中实现您的自定义短信逻辑。由于您现在有了代码参数,这将非常容易。
  4. 授予您的用户池访问权限以调用自定义短信发送器功能。
  5. 为您的用户池设置自定义短信发送器触发器。执行此操作时,您还需要设置 Cognito 将使用的 KMS 密钥。您可以使用 aws-cli 来执行此操作。

参考资料:

官方文档

Terraform 目前不支持自定义短信发送器触发器。关于此有一个未决问题

AWS cli 更新用户池


0
投票

我只是想我应该对此进行补充,除了使用用户池身份验证流程(需要您创建和开发 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 函数。 如果您需要更多信息,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.