用户池允许两个用户使用相同的电子邮件,尽管配置

Posted

技术标签:

【中文标题】用户池允许两个用户使用相同的电子邮件,尽管配置【英文标题】:User Pool allows two users with same email despite configuration 【发布时间】:2018-11-16 18:01:19 【问题描述】:

背景

我正在使用aws-amplify 与 Cognito 进行交互。所以当用户注册我的应用程序时,我会打电话给Auth.signUp()。我只将用户名(电子邮件)和密码传递给此函数。

我的用户池配置为仅允许通过电子邮件登录:


虫子?

在我的前端代码中,我不小心注册了两次事件侦听器,因此Auth.signUp() 被调用了两次(同时,或至少快速连续地)使用相同的参数。

这导致在我的用户池中创建了两个用户,使用相同的电子邮件。我对我的用户池配置的理解表明这是不可能的。


比赛条件?

我的第一个想法是,由于我发送的两个请求如此接近,这可能是某种不可避免的竞争条件。如果我在调用之间引入人为的暂停(比如断点或setTimeout),一切都会按预期进行。

但是,即使请求间隔非常紧密,第二个请求确实会返回我期望的错误响应:

 code: 'InvalidParameterException',
  name: 'InvalidParameterException',
  message: 'Alias entry already exists for a different username' 

遗憾的是,此响应具有误导性,因为我确实通过此请求在我的池中创建了第二个(重复的)用户。


MCVE

这很容易通过在节点脚本或浏览器中同时执行两次Auth.signUp 来重现。 This repository contains examples of both.


问题

这是 Cognito 的合法错误吗? preSignUp Lambda 触发器是我唯一防御这种情况的方法吗?如果是这样,该实施的大致流程是什么样的?

【问题讨论】:

我认为 Cognito 将允许两个用户使用相同的电子邮件注册,但只有一个用户能够验证/确认帐户。否则,有人可能会在系统上窃取您的电子邮件……但这可能不是您所看到的问题,具体取决于您的竞争条件。 @PaulHoenecke 感谢您的参与。似乎一秒钟是一个神奇的数字...如果我的通话间隔超过一秒钟,我不会得到两个在我的池中创建的用户。如果我的通话间隔不到一秒,我会这样做。如果第二个响应(创建重复用户)返回成功,我不会考虑这种错误行为。但是,很难将错误响应与正在创建的用户协调起来。如果创建了用户,我需要一个成功响应,以便我可以将有关用户的元数据填充到 DynamoDB 中。 相反,如果我收到来自signUp() 的错误响应,我想确信没有创建新用户。事实上,我得到的响应基本上是“抱歉,无法创建该用户”,但无论如何都会创建一个用户,只是感觉不对。我觉得被骗了 这对我来说绝对是一个(或两个)错误。在这种情况下,如果只是检查 cognito 用户池中的现有电子邮件并且可能遭受相同的竞争条件,我认为常规的预注册触发器不会有帮助。您可以尝试插入具有唯一约束的 RDS 表,但这违背了在 cognito 中进行检查的目的,但是如果您的 cognito 注册由于其他原因而失败,则必须以某种方式将其删除。可能最好修复您的代码,向 AWS 提出问题,然后继续 :) 这是一个非常真实的错误,我也遇到过。 【参考方案1】:

我将此发送给 AWS 支持。他们知道这个问题,但没有 ETA。

感谢您联系 AWS 高级支持。我明白你 想知道 Cognito 团队是否知道发布的问题 这里[1]。

我与 Cognito 团队进行了核实,是的,他们知道这一点 问题/错误。好消息是,我们已经有麻烦开票了 Cognito 团队来解决这个问题。但是,我将无法提供 ETA 关于此修复程序何时上线,因为我没有任何可见性 他们的开发/发布计划。但是,我要感谢你 您在提请我们注意这个问题方面所做的重要贡献,我愿意 欣赏它。

【讨论】:

他们有没有回过你来? 哎呀他们怎么还没解决这个问题,太疯狂了! @stavros.zavrakas nope 仍然没有解决这个问题?绝对奇怪的是,这在过去几年中无法解决 在这个问题上运气好吗?【参考方案2】:

Cognito 将用户名限制为仅限一位用户。但是,是的,多个用户可以共享一封电子邮件。

【讨论】:

我有一个要求,即 cognito 中的多个用户可以拥有相同的电子邮件地址,并且可以与多个用户进行验证。截至目前,Cognito 可以拥有具有相同电子邮件地址的用户,但它会为多个用户保持验证。【参考方案3】:

我与 AWS 进行了交谈,仍然没有修复,也没有时间估计。

【讨论】:

以上是关于用户池允许两个用户使用相同的电子邮件,尽管配置的主要内容,如果未能解决你的问题,请参考以下文章

使用Devise配置ActionMailer以允许来自不同用户的电子邮件。

无法在新用户池中配置发件人电子邮件

配置 Cognito 用户池以使用 SES 发送电子邮件

AWS CloudFormation 脚本失败 - 不允许 Cognito 使用您的电子邮件身份

如何使用 CloudFormation 允许使用用户名和电子邮件登录的 AWS Cognito 配置?

允许使用 django-profiles 更改用户字段(如电子邮件)