AWS Cognito 响应 New_Password_Required 质询返回“无法修改已提供的电子邮件”

Noe*_*ott 11 amazon-cognito aws-sdk-js

每当尝试使用 AWS Cognito 响应 NEW_PASSWORD_REQUIRED 质询时,已经成功运行了几年的应用程序就会开始抛出以下错误:

{"__type":"NotAuthorizedException","message":"无法修改已提供的电子邮件"}

我正在发送以下内容,这些内容似乎都与文档相符。

{
    "ChallengeName": "NEW_PASSWORD_REQUIRED",
    "ClientId": <client_id>,
    "ChallengeResponses": {
        "userAttributes.email": "test@example.com",
        "NEW_PASSWORD": "testP@55w0rd",
        "USERNAME": "testfake"
    },
    "Session": <session_id>
}
Run Code Online (Sandbox Code Playgroud)

前端没有任何改变;我们在 Cognito/AWS 端所做的配置更改是否可能导致此错误?

dqr*_*rjz 18

我最近开始遇到同样的错误。我正在关注用例 23 对用户进行身份验证并为用户设置新密码。经过一番调查,我发现这是导致抛出错误的email属性。我得到的曾经是一个空对象,但现在看起来像这样:userAttributescompleteNewPasswordChallengeuserAttributesauthenticateUser{}

{ email_verified: 'true', email: 'test@example.com' }
Run Code Online (Sandbox Code Playgroud)

email在将email_verifieduserAttribute 用于completeNewPasswordChallenge. 所以我的代码现在是这样的:

cognitoUser.authenticateUser(authenticationDetails, {

    ...

    newPasswordRequired: function(userAttributes, requiredAttributes) {
        // the api doesn't accept this field back
        delete userAttributes.email_verified;
        delete userAttributes.email; // <--- add this line

        // store userAttributes on global variable
        sessionUserAttributes = userAttributes;
    }
});

// ... handle new password flow on your app
handleNewPassword(newPassword) {
  cognitoUser.completeNewPasswordChallenge(newPassword, sessionUserAttributes);
}
Run Code Online (Sandbox Code Playgroud)

我猜 aws 最近更改了他们的 api,但我还没有找到任何关于此更改的文档。即使该email属性的值与用户的实际电子邮件相同,Cannot modify an already provided email如果您将其包含在请求中,它也会引发错误。删除它可以解决该问题。

  • 这是可行的,AWS 更改 API 并且不发布任何更新和日志是非常不负责任的。 (4认同)
  • 这篇文章和答案刚刚救了我——我的情况完全相同。我不知道发生了什么变化,但可以确认删除电子邮件属性为我解决了这个问题。这是我的代码:``` // 删除电子邮件属性;AWS 端的某些内容在这里失败了导出异步函数completeNewPassword({ user, newPassword, name }) { const data = wait Auth.completeNewPassword(user, newPassword, { name }); 返回数据;} ``` (2认同)