AWS Cognito - 用户陷入CONFIRMED并且email_verified = false

时间:2016-08-30 15:38:05

标签: amazon-cognito

如何查询确认已确认但email_verified为false的用户的电子邮件?

该场景大致是代理人代表他们注册用户,我通过管理员电话adminConfirmSignUp确认用户。此时,由于email_verified标志为false,用户无法更改其密码。

我无法调用resendConfirmationCode,因为用户已经确认。

我无法调用forgotPassword,因为email_verified标志为false。

我能想到的最好的方法是删除用户帐户并调用signUp(提示他们重新输入密码或新密码),从而重新创建帐户。

8 个答案:

答案 0 :(得分:14)

使用AWS CLI,您可以更新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

答案 1 :(得分:12)

您可以通过调用email_verified而不使用任何lambda和触发器来更改phone_number_verifiedadminUpdateUserAttributes和其他属性:

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

答案 2 :(得分:5)

现在,您可以使用预注册lambda触发器以email_verified

修改返回的事件,以编程方式将event.response.autoVerifyEmail = true;设置为true。

它不在文档中,而是referenced on this github issue。另请阅读working with cognito lambda triggers

答案 3 :(得分:2)

目前,Cognito不允许外部代理代表用户更新email_verified和phone_verified属性。这些可以被标记为真的唯一方法是通过代码验证过程,该过程可以由最终用户完成。

流程是这样的:用户登录并获取访问令牌。然后,他们使用要验证的属性调用GetUserAttrbuteVerificationCode API。这将向用户提供一个代码,可以通过调用VerifyUserAttribute来使用该代码,该代码会将属性翻转为已验证。

答案 4 :(得分:1)

这是代理可以用来创建用户的另一种方法。 您可以代表用户使用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 
});
 });

答案 5 :(得分:0)

Trigger on pre-registration这个lambda函数(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

答案 6 :(得分:0)

使用python验证aws cognito上的用户电子邮件

response = client.get_user_attribute_verification_code(AccessToken ='eyJraWQiOiJtTEM4Vm ......',AttributeName ='email')

response = client.verify_user_attribute(AccessToken ='eyJraWQiOiJtTEM ......',AttributeName ='email',Code ='230433')

答案 7 :(得分:0)

它给出了一条错误消息:“没有提供电子邮件,但 email_verified 是真的”,代码:“InvalidParameterException”。

所以我也在属性列表中添加了 email 属性。

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
    },
  );