AWS Cognito - 用户丢失 "non-mutable" 属性 "email_verified"
AWS Cognito - Users lost "non-mutable" attribute "email_verified"
使用 Cognito 几个月后,用户池中的一些用户现在失去了 "email_verified" 属性。我不明白它是如何丢失或如何恢复的。
症状是:
- 用户仍然可以登录
- 用户密码无法更改(例如通过JS SDK - changePassword),产生错误:"x-amzn-errormessage: Cannot reset password for the user as there is no registered/verified email or phone_number"
获取具有 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
除了责怪 AWS Cognito,我找不到这个问题的原因。
一个workaround/hack/patch是把属性加回来,这次,non-mutable check没问题
aws cognito-idp admin-update-user-attributes --user-pool-id MYID-123 --username error@bla.com --user-attributes Name=email_verified,Value=true
现在用户又拥有了属性,我可以重新设置密码了。
如果有 2 位用户使用相同的电子邮件地址,并且 email_verified
对其中一个为真而不对另一个为真,则可能是您的客户端代码存在问题。
当您调用 confirmRegistration
时,第一个参数是确认码,第二个是布尔值:forceAliasCreation
。如果设置为 true,则如果用户已经存在用于注册的电子邮件地址,则新用户 "steals" 现有用户的电子邮件地址。
这不是一个明显的问题,因为 Cognito API 文档显示了 confirmRegistration
的示例,其中 forceAliasCreation
为 true 并且没有解释参数的作用(https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js - 用例 2,假设您使用的是 JS)。我们 运行 在我们的应用程序中遇到了这个问题,这是罪魁祸首。
使用 Cognito 几个月后,用户池中的一些用户现在失去了 "email_verified" 属性。我不明白它是如何丢失或如何恢复的。
症状是:
- 用户仍然可以登录
- 用户密码无法更改(例如通过JS SDK - changePassword),产生错误:"x-amzn-errormessage: Cannot reset password for the user as there is no registered/verified email or phone_number"
获取具有 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
除了责怪 AWS Cognito,我找不到这个问题的原因。
一个workaround/hack/patch是把属性加回来,这次,non-mutable check没问题
aws cognito-idp admin-update-user-attributes --user-pool-id MYID-123 --username error@bla.com --user-attributes Name=email_verified,Value=true
现在用户又拥有了属性,我可以重新设置密码了。
如果有 2 位用户使用相同的电子邮件地址,并且 email_verified
对其中一个为真而不对另一个为真,则可能是您的客户端代码存在问题。
当您调用 confirmRegistration
时,第一个参数是确认码,第二个是布尔值:forceAliasCreation
。如果设置为 true,则如果用户已经存在用于注册的电子邮件地址,则新用户 "steals" 现有用户的电子邮件地址。
这不是一个明显的问题,因为 Cognito API 文档显示了 confirmRegistration
的示例,其中 forceAliasCreation
为 true 并且没有解释参数的作用(https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js - 用例 2,假设您使用的是 JS)。我们 运行 在我们的应用程序中遇到了这个问题,这是罪魁祸首。