Я успешно реализовал процесс входа в систему без пароля OTP, следуя этому руководству с некоторыми изменениями.
При создании нового пользователя в Amazon Cognito меня просят выбрать между основным атрибутом входа пользователя:
Я также настроил несколько сценариев POSTMAN для успешного запуска потока. Вот запрос на инициацию потока:
Детали запроса:
Метод: ПОСТ
URL-адрес: https://cognito-idp.<region_id>.amazonaws.com/
Заголовки:
Тело:
{
"AuthFlow": "CUSTOM_AUTH",
"ClientId": <CLIENT-ID>,
"AuthParameters": {
"USERNAME": <email or phone>
}
}
Текущее поведение: Я могу успешно завершить процесс входа в систему OTP, если:
username заполнен адресом электронной почты, и пользователь был создан с адресом электронной почты в качестве основного атрибута входа.username заполнен номером телефона, и пользователь был создан с номером телефона в качестве основного атрибута входа.Однако я не могу использовать как адрес электронной почты, так и номер телефона для одного пользователя как взаимозаменяемые, поскольку это зависит от основного атрибута входа, выбранного во время создания пользователя.
Проблема: Я пытаюсь реализовать поток, в котором адрес электронной почты или номер телефона могут использоваться для одного пользователя независимо от основного атрибута входа. В настоящее время это, похоже, ограничено конфигурацией регистрации.
Подробности: В моей реализации функция DefineAuthChallenge Lambda получает пустого пользователя и атрибут userNotFound, для которого установлено значение true в запросе события при попытке использовать неосновной атрибут.
Вопрос: Можно ли настроить Amazon Cognito так, чтобы один пользователь мог использовать адрес электронной почты или номер телефона для входа без пароля без OTP? Я не смог найти никакой документации по этому конкретному варианту использования. Я нашел этот вопрос, но ничего не могу получить из этого решения.
Будем очень признательны за любые рекомендации или ссылки на соответствующую документацию.
Спасибо!





Во-первых, если это клиентское приложение, которое напрямую вызывает Cognito API, рассмотрите возможность проксирования через собственный бэкэнд.
Теперь на серверной стороне вы можете использовать имя пользователя или адрес электронной почты для поиска пользователей, используя: ListUsers
Пример запроса:
{
"AttributesToGet": [ "email","phone_number" ],
"Filter": "<<username|email>>",
"Limit": number,
"PaginationToken": "string",
"UserPoolId": "string"
}
Ожидаемый ответ:
{
"PaginationToken": "efgh5678EXAMPLE",
"Users": [
{
"Attributes": [
{
"Name": "sub",
"Value": "eaad0219-2117-439f-8d46-4db20e59268f"
},
{
"Name": "email",
"Value": "[email protected]"
}
],
"Enabled": true,
"UserCreateDate": 1682955829.578,
"UserLastModifiedDate": 1689030181.63,
"UserStatus": "CONFIRMED",
"Username": "testuser"
},
// TRUNCATED
Теперь просто используйте Username в ответе, чтобы продолжить аутентификацию.