Я потратил несколько дней на интеграцию пользовательского потока аутентификации в AWS Cognito. Это работает, но это уже немного сложно. Теперь мне пришла идея обработать весь процесс аутентификации, например, в функции Lambda, через Admin (без CUSTOM_AUTH).
Для этого я просто написал следующий код в машинописи
const UserPoolId = "";
const email = "";
const ClientId = "";
const Password = buildSecretPassword()
const isUserAuthenticated = checkIsUserAuthenticated();
if (!isUserAuthenticated) {
throw new Error("you are not authorized")
}
const service = new CognitoIdentityServiceProvider({ region: "eu-central-1" });
let currentUser: CognitoIdentityServiceProvider.AdminGetUserResponse;
try {
currentUser = await service.adminGetUser({ UserPoolId, Username: email }).promise();
} catch (error) { }
if (!currentUser)
await service.adminCreateUser(
{
Username: email,
UserPoolId
}).promise()
await service.adminSetUserPassword(
{
Username: email,
UserPoolId,
Password,
Permanent: true
}).promise()
const res = await service.adminInitiateAuth({
AuthFlow: "ADMIN_USER_PASSWORD_AUTH",
ClientId,
UserPoolId,
AuthParameters: {
USERNAME: email,
PASSWORD: Password
}
}).promise()
return res.AuthenticationResult;
Это относительно просто, он проверяет, авторизован ли пользователь для входа (OAuth, API-Token ...), если да, то создайте пользователя, если он еще не существует, установите случайный пароль и войдите в систему пользователя .
На стороне клиента только эта лямбда-функция должна выполняться через ApiGateway, необходимо создать пустой сеанс и сделать его «действительным» с помощью токена refre sh (который возвращает ApiGateway).
Чтобы пользователь не мог войти в систему стандартным способом, в пуле пользователей активирован только «ALLOW_ADMIN_USER_PASSWORD_AUTH».
Есть что-то, чего я не замечаю, или это возможность аутентификации пользователь