amazon-web-services - AWS Cognito 自定义身份验证 - 将元数据发送到挑战 lambda 函数

标签 amazon-web-services authentication amazon-cognito cognito

我正在开发一个自定义无密码身份验证来登录 Cognito 用户池。我将描述我正在尝试实现的内容,以防万一有什么愚蠢的。我希望用户输入他们的电子邮件地址,然后通过电子邮件收到一个神奇的登录链接,当他们点击该链接时,将被带回网站并登录。

这使用自定义身份验证 lambda 函数来定义/创建具有基于时间的密码的质询,并将其通过电子邮件发送给用户。我有几个问题:

问题 1)

当用户返回代码时,他们可能不在同一个浏览器/设备中,并且肯定不会在同一个选项卡中,因此他们没有 session ,这意味着我需要再次调用 cognitoUser.initiateAuth。这将再次通过定义/创建挑战 lambdas,因此即使此时用户来自电子邮件链接,因此已经发送了第二封电子邮件。注意:创建挑战时, session id 在事件对象中不可用,而且我仅在最后 3 分钟内阅读了这些 session ,而基于时间的密码将持续约 15 分钟,所以我认为我不能包含 session 电子邮件中的 ID。

问题2)

您可以从几个地方(浏览器、android 应用程序等)登录,我希望能够将 url 或至少包含协议(protocol)作为参数来控制在电子邮件中发送的内容,例如如果您在 android 应用程序中输入您的电子邮件地址,那么您收到的电子邮件将是 myapp://login?code=xxx,如果您是在网络上输入的,它将是 https://example.com/login?code=xxx

如果我能找到某种方法将自定义元数据发送到 DefineChallenge 和 CreateChallenge lambda,这样它就会出现在事件对象中,我似乎就能够实现这两者以正常工作。我认为将 ValidationData 添加到 AuthenticationDetails 对象可以做到这一点,但该信息不会出现在 Lambda fns 的事件对象中。

我发现的解决方法是为每种情况创建一个新的客户端 ID - 一个用于启动身份验证,一个用于兑换 token ,并为每个不同的协议(protocol)重复。但这很快就会有很多客户 ID - 维护起来很痛苦而且很笨拙。

所以 tl;dr 是:我想在 JS 中从我的 cognitoUser.initiateAuth(...) 调用发送自定义元数据,并让它在我的定义/创建挑战 lambda fns 中可用。

最佳答案

您可以将身份验证过程拆分为多个自定义身份验证质询。这允许通过质询响应提供自定义身份验证状态作为客户端元数据。
身份验证 session 状态必须保存在数据库中,以便在设备之间共享。
您的自定义登录流程可能有两个挑战步骤:第一个提示输入身份验证类型,第二个提示输入密码。 “创建身份验证挑战” Lambda 采取的操作将取决于身份验证类型。如果身份验证类型是“电子邮件”,则生成密码和魔术链接,存储在 DynamoDB 中并通过电子邮件发送。如果身份验证类型为“MagicLink”,则从 DynamoDB 加载 key 。单击魔术链接将启动新的身份验证 session 并自动提供所有挑战答案。
还有一些其他的事情需要考虑:

  • 您的魔术链接需要封装 Cognito 用户名以及一次性 secret ,可能还有一些其他 session id,在 dynamodb 中用作 key 。
  • 您可能不应该将特定于应用程序的链接放入您的电子邮件中。而是 associate your domain with your app和/或利用基于 Web 的登录页面的重定向 URI 参数。
  • 您还可以从 Lambda 函数访问自定义 Cognito 用户属性,这些属性可用于指示用户登录首选项(例如,用于登录代码的电子邮件与 SMS)。
  • 关于amazon-web-services - AWS Cognito 自定义身份验证 - 将元数据发送到挑战 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50680742/

    相关文章:

    amazon-web-services - 我们可以根据请求 header 添加 CloudFront 行为吗?

    amazon-web-services - 如何从 AWS 中的 Athena 检查分区列表?

    amazon-web-services - 只需要记录 Cloudwatch 中的错误

    ios - iOS AWS S3 Upload如何重试失败或失败的任务?

    amazon-web-services - AWS 精确定位 : How to view custom metrics

    amazon-web-services - AWS CLI 工具 - 无法从 S3 递归下载

    python - Tweepy 使用用户名/密码进行身份验证

    firebase - 无法使用cli命令登录Firebase

    ruby-on-rails - Rails 有内置的身份验证系统吗?

    amazon-web-services - 如何使用 AWS cognito 和自定义身份验证来创建临时 s3 上传安全 token