AWS Cognito身份验证返回错误 - Javascript SDK

5
我正在使用AWS Cognito来验证我正在构建的新应用程序中的用户。
在我的项目中,我使用amazon-cognito-identity-js库(Github链接:https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js)。由于此特定用户池中的用户无法自行注册,因此我手动注册他们。根据Github上的README.md所述,我知道我需要“使用案例23”。
因此,我的代码如下:
    ...
    const userPoolData = {
        UserPoolId: <MY_USER_POOL_ID>,
        ClientId: <MY_CLIENT_ID>
    };

    const userPool = new CognitoUserPool(userPoolData);

    const authenticationData = {
        Username: email,
        Password: tempPassword
    };
    const userData = {
        Username: email,
        Pool: userPool
    }

    const authenticationDetails = new AuthenticationDetails(authenticationData);
    const cognitoUser = new CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: (result) => {
            console.log(result);
        },
        onFailure: (err) => {
            console.log("Error from cognito auth: ", err);
        },
        newPasswordRequired: (userAttributes) => {
            delete userAttributes.email_verified;
            cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
        }
    })
    ...

当我执行这段代码时,我成功确认了我的用户。我可以在AWS Cognito控制台上看到这一点。然而,在客户端的javascript控制台中,我没有收到result对象,反而出现了一个错误:
Uncaught (in promise) TypeError: Cannot read property 'onFailure' of undefined
    at eval (CognitoUser.js:572)
    at eval (Client.js:108)

但是当我尝试使用newPassword替代之前发送的tempPassword进行登录时,现在我可以成功获得result对象并且三个令牌都存在。所以我知道一切都有点奏效,但不是我期望的结果。

是什么导致了这个错误?我该如何解决?我希望用户第一次使用tempPassword和他们的newPassword进行登录后立即接收到result对象,这样他们就可以开始使用应用程序。

编辑:



认为我必须自己检索userAttributes是一个错误。 newPasswordRequired函数会自动传递它们。因此,我更新了上面的代码以与Github上提供的“用例23”相匹配。

但现在我遇到了一个略微不同于以前的错误:
Uncaught (in promise) TypeError: callback.onFailure is not a function
    at eval (CognitoUser.js:572)
    at eval (Client.js:108)

在Cognito方面,一切仍然正常运作,但是我的onFailure函数肯定出了问题,这很奇怪。

你有什么想法吗?

提前感谢。


你也试过使用 delete userAttributes.email_verified; 吗? - sayboras
@Apolozeus 是的,我试过了,但是在用户没有认证之前,我无法获取用户属性。如果有一种方法可以获取用户属性,那么我会再试一次。 - Z_z_Z
@Apolozeus 我之前错误地认为我必须自己检索userAttributes,所以我的推理出现了问题。我的错。但是现在我已经添加了删除email_verified属性的代码行,我仍然遇到错误。虽然错误略有不同,但它仍然涉及到onFailure函数。你有什么想法吗? - Z_z_Z
请将以下与编程有关的内容从英语翻译成中文。仅返回已翻译的文本:请更新此函数 cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes);cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this); - sayboras
2个回答

11

好的,我解决了。问题在于我使用了ES6箭头函数。正如Apolozeus指出的那样,我需要将this传递给cognitoUser.completeNewPasswordChallenge函数。但由于ES6的行为方式,this返回undefined。因此,将我的cognitoUser.authenticateUser函数更改为以下内容即可解决所有问题:

  cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            resolve(result.getAccessToken().getJwtToken());
        },
        onFailure: function (err) {
            console.log("Error from cognito promise: ", err);
            reject(err);
        },
        newPasswordRequired: function (userAttributes) {
            delete userAttributes.email_verified;
            cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);
        }
    })

我将尝试对amazon-cognito-identity-js库进行一些调试,看看能否让ES6箭头函数在这里起作用。不得不说这真的很烦人。

向Apolozeus表示感谢。


2
请将以下代码行 cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes); 更新为 cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this)。简单来说,this 将确保在同一对象中的 callback 函数被执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接