Фон
Я использую aws-amplify
для взаимодействия с Cognito.Поэтому, когда пользователь регистрируется в моем приложении, я звоню Auth.signUp()
.Я передаю только имя пользователя (адрес электронной почты) и пароль для этой функции.
Мой пул пользователей настроен на разрешение входа только по электронной почте:
Ошибка?
В своем коде интерфейса я случайно зарегистрировал прослушиватель событий дважды, поэтому вызывался Auth.signUp()
дважды (одновременно или, по крайней мере, в быстрой последовательности) с одинаковыми параметрами.
В результате в моем пуле пользователей было создано два пользователя с одним и тем же адресом электронной почты.Мое понимание конфигурации моего пула пользователей предполагает, что это не должно быть возможным.
Состояние гонки?
Моя первая мысль былачто, поскольку я посылаю два запроса так близко друг к другу, это может быть своего рода неизбежным условием гонки.Если я ввожу искусственную паузу между вызовами (например, точка останова или setTimeout
), все работает, как и ожидалось.
Однако даже при очень узком расстоянии второй запрос делает возвращает ответ об ошибке, который я ожидал:
{ code: 'InvalidParameterException',
name: 'InvalidParameterException',
message: 'Alias entry already exists for a different username'
}
К сожалению, этот ответ вводит в заблуждение, потому что я do получаю второго (дублирующего) пользователя, созданного в моем пулеrequest.
MCVE
Это легко воспроизвести, дважды выполнив Auth.signUp
одновременно, либо в скрипте узла, либо вбраузер. Этот репозиторий содержит примеры обоих.
Вопрос (ы)
- Является ли этозаконный баг с Cognito?
- Является ли preSignUp Lambda моим единственным способом защиты от этого?Если да, то как будут выглядеть широкие штрихи этой реализации?