2016-08-30 213 views
3

我该如何处理电子邮件验证已确认用户但email_verified为false?AWS Cognito - 用户卡在CONFIRMED和email_verified = false

这种情况大致是代理人代表他们注册用户,我通过管理员调用adminConfirmSignUp来确认用户。此时,由于email_verified标志为false,用户无法更改其密码。

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

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

我能想到的最好的办法是删除用户帐户并呼叫signUp(提示他们重新输入密码或新密码),然后重新创建其帐户。

回答

1

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

进程是这样​​的:用户登录并获取访问令牌。然后他们使用他们想验证的属性调用GetUserAttrbuteVerificationCode API。这将向用户传递一个代码,可以通过调用VerifyUserAttribute来使用该代码,该代码将验证该属性。

+0

感谢您的回复,所以我收集如果用户丢失了密码,我们处于CONFIRMED email_verified = false状态,唯一能想到的是将删除他们的帐户并重新创建它。 – user1432403

+0

正确。他们必须登录才能获取通过此流程所需的令牌。 –

+0

有没有计划让这个工作? [docs](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html)表示在创建用户时该标志可以设置为true,而控制台排序认为它已被验证(它将显示“重置密码”按钮),但实际上尝试重置密码失败并显示“未验证的电子邮件”错误。对于用户来说,通过电子邮件向他们发送一个临时密码似乎不仅仅是一件愚蠢的事情(而且也是一种痛苦),然后再发送*另一封电子邮件来验证他们的电子邮件地址是否有效。 – kdgregory

3

你可以通过调用adminUpdateUserAttributes没有任何lambda表达式改变email_verifiedphone_number_verified和其他属性和触发器:

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

我可以确认此作品。不幸的是,尽管Cognito不会将我的“确认后”触发器称为“触发器”,但这是我猜想的另一个问题。 –

+1

@RyanShillington,你是正确的,当用户状态变为'CONFIRMED'时,“确认后”触发器触发。 如果你想在用户属性改变时调用你的“Post确认”触发器,即使状态已经处于CONFIRMED状态(即从另一个lambda调用另一个lambda),你可以使用SNS主题:https:/ /gist.github.com/jeremypruitt/ab70d78b815eae84e037 只是一个要点,我相信你可以找到AWS的文档。 – aring

1

也有从CLI更新email_verified属性

aws cognito-idp admin-update-user-attributes 
--user-pool-id eu-west-xxxxxx 
--username [email protected] 
--user-attributes Name=email_verified,Value=true 
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": "[email protected]" 
     }, 
     "validationData": { 
      "k1": "v1", 
      "k2": "v2" 
     } 
    }, 
    "response": { 
     "autoConfirmUser": false, 
     "autoVerifyEmail": false, 
     "autoVerifyPhone": false 
    } 
} 

当你创建一个从API的验证标志应该是true用户测试它现在。

0

验证在AWS用户电子邮件cognito用蟒

响应= client.get_user_attribute_verification_code(的accessToken = 'eyJraWQiOiJtTEM4Vm ......',的AttributeName = '电子邮件')

响应= client.verify_user_attribute(的accessToken ='eyJraWQiOiJtTEM ......',AttributeName ='email',Code ='230433')