AWS Cognito-用户丢失了“不可更改”属性“ email_verified”

时间:2018-08-07 03:02:00

标签: amazon-web-services amazon-cognito aws-userpools

使用Cognito几个月后,用户池中的某些用户现在失去了“ email_verified”属性。我不明白它是怎么丢失的或如何恢复的。

症状是:

  • 用户仍然可以登录
  • 用户密码无法更改(例如,通过JS SDK - changePassword),并产生错误:“ x-amzn-errormessage:由于没有注册/验证的电子邮件或电话号码,因此无法为用户重置密码”
  • 使用list-users CLI获取用户的用户属性显示该属性丢失

    aws cognito-idp list-users --user-pool-id MYID-123 --query 'Users[?Username==`error@bla.com`].[*]'
    [
      [
        [
            "error@bla.com", 
            true, 
            "CONFIRMED", 
            1522127817.526, 
            1522127819.369, 
            [
                {
                    "Name": "sub", 
                    "Value": "123123123341241238"
                }, 
                {
                    "Name": "email", 
                    "Value": "bla@bla.com"
                }
            ]
         ]
      ]
    ]
    

    vs。具有适当属性的一个

    aws cognito-idp list-users --user-pool-id MYID-123 --query 'Users[?Username==`bla@bla.com`].[*]'
    [
      [
        [
            "bla@bla.com", 
            true, 
            "CONFIRMED", 
            1524048734.588, 
            1524048737.777, 
            [
                {
                    "Name": "sub", 
                    "Value": "1231231231231235"
                }, 
                {
                    "Name": "email_verified", 
                    "Value": "true"
                }, 
                {
                    "Name": "email", 
                    "Value": "bla@bla.com"
                }
            ]
          ]
       ]
     ]
    

如果我尝试删除该属性(具有足够的权限),则该属性将失败-正如人们所期望的那样-说明该属性是不可变的。

aws cognito-idp admin-delete-user-attributes --user-pool-id MYID-123 --username test2@test.com --user-attribute-names email_verified

An error occurred (InvalidParameterException) when calling the AdminDeleteUserAttributes operation: Cannot modify the non-mutable attribute email_verified

2 个答案:

答案 0 :(得分:0)

除了归咎于AWS Cognito之外,我找不到导致此问题的原因。

一种解决方法/破解/补丁是重新添加属性,这一次,非可变检查不是问题

aws cognito-idp admin-update-user-attributes --user-pool-id MYID-123 --username error@bla.com --user-attributes Name=email_verified,Value=true

现在用户再次具有该属性,我可以重置密码。

答案 1 :(得分:0)

如果有2个用户具有相同的电子邮件地址,并且email_verified对一个用户(而不是另一个用户)为true,则可能是您的客户端代码有问题。

调用confirmRegistration时,第一个参数是确认码,第二个参数是布尔值:forceAliasCreation。如果设置为true,那么如果用户已经存在用于注册的电子邮件地址,则新用户将“窃取”现有用户的电子邮件地址。

这不是很明显的问题,因为Cognito API文档显示了confirmRegistrationforceAliasCreation为真的示例public static DBHelperClass getInstance(Context context) { int i = 0; while (i < 2) { if (mInstance == null) { try { mInstance = new DBHelperClass(context.getApplicationContext()); db = mInstance.getWritableDatabase(); break; } catch (Exception e) { e.printStackTrace(); try { if (mInstance != null) { mInstance.close(); mInstance = null; i++; } } catch (Exception e1) { e1.printStackTrace(); } } } } return mInstance; } 并没有解释参数的作用(https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js-用例2,假设您正在使用JS)。我们的应用程序遇到了这个问题,这是罪魁祸首。