背景
我aws-amplify
用来与 Cognito 交互。因此,当用户注册我的应用程序时,我会调用Auth.signUp()
. 我只将用户名(电子邮件)和密码传递给这个函数。
我的用户池配置为仅允许通过电子邮件登录:
错误?
在我的前端代码中,我不小心注册了一个事件监听器两次,因此Auth.signUp()
被调用了两次(同时,或至少快速连续地)使用相同的参数。
这导致在我的用户池中创建了两个用户,使用相同的电子邮件。我对我的用户池配置的理解表明这是不可能的。
种族条件?
我的第一个想法是,由于我发送的两个请求如此接近,这可能是某种不可避免的竞争条件。如果我在调用之间引入人为的暂停(比如断点,或者setTimeout
说),一切都会按预期工作。
但是,即使请求间隔非常紧密,第二个请求也会返回我期望的错误响应:
{ code: 'InvalidParameterException',
name: 'InvalidParameterException',
message: 'Alias entry already exists for a different username'
}
可悲的是,此响应具有误导性,因为我确实通过此请求在我的池中创建了第二个(重复的)用户。
MCVE
Auth.signUp
这很容易通过在节点脚本或浏览器中同时 执行两次来重现。此存储库包含两者的示例。
问题
- 这是 Cognito 的合法错误吗?
- preSignUp Lambda 触发器是我唯一防御这种情况的方法吗?如果是这样,那么该实施的大致流程是什么样的?