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')

Другие вопросы по тегам