3

在使用 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"
                }
            ]
         ]
      ]
    ]
    

    与一个具有适当属性的

    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
4

2 回答 2

3

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

一个workaround/hack/patch就是把属性加回去,这一次,非可变检查就没有问题了

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

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

于 2018-08-07T04:19:48.920 回答
0

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

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

这不是很明显这是一个问题,因为 Cognito API 文档将confirmRegistrationwith的示例显示forceAliasCreation为 true 并且没有解释参数的作用(https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon- cognito-identity-js - 用例 2,假设您使用的是 JS)。我们的应用程序遇到了这个问题,这就是罪魁祸首。

于 2018-08-09T06:19:17.823 回答