如何查询确认已确认但email_verified为false的用户的电子邮件?
该场景大致是代理人代表他们注册用户,我通过管理员电话adminConfirmSignUp确认用户。此时,由于email_verified标志为false,用户无法更改其密码。
我无法调用resendConfirmationCode,因为用户已经确认。
我无法调用forgotPassword,因为email_verified标志为false。
我能想到的最好的方法是删除用户帐户并调用signUp(提示他们重新输入密码或新密码),从而重新创建帐户。
答案 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_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!')
}
})
答案 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
},
);