AWS Cognito - пользователь застрял в ПОДТВЕРЖДЕНО и email_verified = false
Как мне узнать, подтвердил ли пользователь, который ПОДТВЕРЖДЕН, но email_verified имеет значение false?
Сценарий грубо говоря, агент регистрирует пользователя от его имени, и я подтверждаю его через вызов администратора adminConfirmSignUp. В этот момент пользователь не может изменить свой пароль, поскольку флаг email_verified имеет значение false.
Я не могу вызвать resendConfirmationCode, потому что пользователь уже подтвержден.
Я не могу вызвать ForgotPassword, потому что флаг email_verified имеет значение false.
Лучшее, что я могу придумать, - это удалить учетную запись пользователя и вызвать регистрацию (побуждая их повторно ввести свой пароль или новый пароль), следовательно, воссоздать их учетную запись.
8 ответов
В настоящее время Cognito не позволяет внешнему агенту обновлять атрибуты email_verified и phone_verified от имени пользователя. Единственный способ, которым они могут быть помечены как истинные, - это процесс проверки кода, который может выполнить конечный пользователь.
Процесс такой: пользователь входит в систему и получает токен доступа. Затем они вызывают API GetUserAttrbuteVerificationCode с атрибутом, который они хотят проверить. Это доставит пользователю код, который можно использовать, вызвав VerifyUserAttribute, который перевернет атрибут при проверке.
С помощью интерфейса командной строки AWS вы можете обновить атрибут email_verified:
aws cognito-idp admin-update-user-attributes
--user-pool-id eu-west-xxxxxx
--username xxxxyyyy@example.com
--user-attributes Name=email_verified,Value=true
Ты можешь измениться email_verified
, phone_number_verified
и другие атрибуты по телефону adminUpdateUserAttributes
без всяких лямбд и триггеров:
'use strict'
var AWS = require('aws-sdk')
AWS.config.update({
accessKeyId: 'YOUR_ACCESS_KEY_HERE',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY_HERE',
region: 'us-east-1' // change region if required
});
var CognitoIdentityServiceProvider = AWS.CognitoIdentityServiceProvider
var client = new CognitoIdentityServiceProvider({
apiVersion: '2016-04-19',
region: 'us-east-1' // change region if required
})
client.adminUpdateUserAttributes({
UserAttributes: [{
Name: 'phone_number_verified',
Value: 'true'
}, {
Name: 'email_verified',
Value: 'true'
}
// other user attributes like phone_number or email themselves, etc
],
UserPoolId: 'COGNITO_USER_POOL_ID_HERE',
Username: 'USERNAME'
}, function(err) {
if (err) {
console.log(err, err.stack)
} else {
console.log('Success!')
}
})
Теперь вы можете программно установить email_verified
в значение true с использованием лямбда-триггера Pre-Registration и изменения возвращаемого события с помощью event.response.autoVerifyEmail = true;
Это еще не в документах, но упоминается в этом выпуске github. Также прочитайте работу с лямбда-триггерами Cognito.
Вот еще один подход, который вы можете использовать для создания пользователей агентами. Вы можете использовать AdminCreateUser от имени пользователя. При вызове этого API пользователь будет создан с временным паролем, который будет отправлен на адрес электронной почты пользователя. (т.е. пользователь будет в состоянии Force_Change_Password). Теперь используйте RespondToAuthChallenge API, чтобы изменить пароль.
Примечание. Вам необходимо установить атрибут email_verified в списке атрибутов. чтобы убедиться, что электронная почта пользователя будет проверена.
Вот пример кода в NodeJS:
var params = {
UserPoolId: process.env.userPoolId, /* required */
Username: email,//'STRING_VALUE', /* required */
DesiredDeliveryMediums: [
"EMAIL",
/* more items */
],
ForceAliasCreation: false,
UserAttributes: [{
Name: 'email_verified',
Value: 'True'
},/* any other Attributes*/],
};
cognitoidentityserviceprovider.adminCreateUser(params, function (err, data) {
if (err) {
console.log(err, err.stack);
reject(err); // an error occurred
}
else {
console.log(data);
resolve(data);
}// successful response
});
});
Выдавалось сообщение об ошибке: «Электронный адрес не указан, но email_verified был истинным», код: «InvalidParameterException».
Поэтому я добавил также атрибут электронной почты в список атрибутов.
const params = {
UserPoolId: this.userPoolId /* required */,
Username: username /* required */,
TemporaryPassword: password,
DesiredDeliveryMediums: ['EMAIL'],
ForceAliasCreation: false,
UserAttributes: [
{
Name: 'email_verified' /* required */,
Value: 'true',
},
{
Name: 'email' /* required */,
Value: email,
},
],
};
затем создайте пользователя с этими параметрами
cognitoidentityserviceprovider.adminCreateUser(
params,
(err, data) => {
console.log(data);
if (err) {
console.log(err);
reject(err);
throw new BadRequestException(err);
}
// an error occurred
else resolve(data); // successful response
},
);
Запуск по предварительной регистрации этой лямбда-функции (Node.js v6):
exports.handler = function(event, context) {
event.response.autoConfirmUser = true;
event.response.autoVerifyEmail = true;
event.response.autoVerifyPhone = true;
context.done(null, event);
};
Используя "Настроить тестовое событие", вы можете сначала протестировать его с этой полезной нагрузкой.
{
"version": 1,
"triggerSource": "PreSignUp_SignUp",
"region": "<region>",
"userPoolId": "<userPoolId>",
"userName": "<userName>",
"callerContext": {
"awsSdk": "<calling aws sdk with version>",
"clientId": "<apps client id>"
},
"request": {
"userAttributes": {
"email": "usertestsns06@yopmail.com"
},
"validationData": {
"k1": "v1",
"k2": "v2"
}
},
"response": {
"autoConfirmUser": false,
"autoVerifyEmail": false,
"autoVerifyPhone": false
}
}
Теперь, когда вы создаете пользователя из API, эти флаги проверки должны быть true
,
Проверить электронную почту пользователя на AWS Cognito с Python
response = client.get_user_attribute_verification_code (AccessToken = 'eyJraWQiOiJtTEM4Vm......', AttributeName = 'email')
response = client.verify_user_attribute (AccessToken = 'eyJraWQiOiJtTEM......', AttributeName = 'email', код ='230433')