AWS Cognito 响应 New_Password_Required 挑战 returns "Cannot modify an already provided email"

AWS Cognito Respond to New_Password_Required challenge returns "Cannot modify an already provided email"

一个已经成功运行了几年的应用程序在尝试使用 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>
}

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

我最近开始遇到同样的错误。我正在关注 Use case 23 Authenticate a user and set new password for a user。经过一些调查,我发现 userAttributes 中的 email 属性导致 completeNewPasswordChallenge 抛出错误。我从authenticateUser得到的userAttributes曾经是一个空对象{},但现在看起来是这样的:

{ email_verified: 'true', email: 'test@example.com' }

在使用 completeNewPasswordChallenge 的 userAttribute 之前,我不得不删除 email 属性(以及用例 23 中示例代码中所示的 email_verified 属性)。所以我的代码现在是这样的:

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);
}

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