Собственный поток аутентификации Cognito на собственном сервере - PullRequest
0 голосов
/ 05 апреля 2020

Я потратил несколько дней на интеграцию пользовательского потока аутентификации в 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».

Есть что-то, чего я не замечаю, или это возможность аутентификации пользователь

...