У меня есть когнитивный лямбда-триггер presign-up в nodejs. Этот триггер связывает пользователей, выполняющих вход с помощью Google, с существующими пользователями в когнитивном режиме. Пока что это работает в отношении связывания пользователей, но только если я возвращаю ошибку в функции, это не создает другого пользователя в когнито.
Так что прямо сейчас у меня есть
const run = require("./index");
exports.handler = async (event, context) => {
console.info(JSON.stringify(event, null, 4));
if (event.triggerSource !== "PreSignUp_ExternalProvider") {
return event;
}
const userPoolId = event.userPoolId;
const email = event.request.userAttributes.email;
const username = event.userName;
const allow = await run(userPoolId, email, username);
if (!allow) {
return Promise.reject("NO_USER");
}
return Promise.reject("MERGED_GOOGLE");
};
На клиенте, когда пользователь пытается войти в систему в первый раз с помощью Google, в URL-адресе отправляется следующий ответ:
/#error_description=PreSignUp+failed+with+error+MERGED_GOOGLE.+&state=Er4wfOE1grgx8lVHVl8EhIkYWIVtTo96&error=invalid_request. Впоследствии, когда пользователь пытается снова войти в систему через Google, это работает нормально, и в клиенте не отображаются ошибки. Пользователь успешно привязан к соответствующему пользователю когнито, и все работает. Все работает, кроме первой попытки входа в систему!
Однако если я изменю это на
const run = require("./index");
exports.handler = async (event, context) => {
console.info(JSON.stringify(event, null, 4));
if (event.triggerSource !== "PreSignUp_ExternalProvider") {
return event;
}
const userPoolId = event.userPoolId;
const email = event.request.userAttributes.email;
const username = event.userName;
const allow = await run(userPoolId, email, username);
if (!allow) {
return Promise.reject("NO_USER");
}
return event;
};
Между пользователями создается ссылка, но в пул пользователей добавляется дополнительный пользователь Google, и снова при первой попытке входа в клиент возникает ошибка, но на этот раз с: /#error_description=Already+found+an+entry+for+username+google_<googleId>+&state=gBXzf4AgMRzJ9PWWFoNfIX2tFDeNnVAg&error=invalid_request
Вопрос в том, как предотвратить создание дополнительного пользователя в пользовательском пуле при связывании пользователей и отсутствие ошибки в URL-адресе при первой попытке входа?
У меня есть подозрение, что это достигается с помощью другого лямбда-триггера, но каким? Или ответ от моего существующего триггера должен быть другим и как?





Это известная проблема. К сожалению, вам просто нужно обработать первую ошибку и либо попросить пользователя перезапустить вход, либо сделать это за него.