我正在使用AWS Cognito在我正在构建的新应用程序中对用户进行身份验证。
我在我的项目中使用amazon-cognito-identity-js库(链接到Github:https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js)。由于该特定用户池中的用户无法注册自己-我手动注册-我知道我需要“用例23”,如Github的README.md所述。
所以我的代码如下:

    ...
    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控制台中看到这一点。但是,我没有收到result对象,而是在客户端的javascript控制台中收到一条错误消息,内容为:
Uncaught (in promise) TypeError: Cannot read property 'onFailure' of undefined
    at eval (CognitoUser.js:572)
    at eval (Client.js:108)
但是,当我尝试使用newPassword代替以前发送的tempPassword登录时,现在我能够成功获得带有三个标记的result对象。
因此,我知道一切都可以正常工作,但并不是我所期望的。
是什么导致此错误?我该如何解决?我想在用户首次使用result及其tempPassword登录时立即接收newPassword对象,以便他们可以开始使用该应用程序。
编辑:
认为我必须自己检索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函数一定存在问题,这很奇怪。
有什么想法吗?
提前致谢

最佳答案

好吧,我解决了。问题是我正在使用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寻求帮助

关于javascript - AWS Cognito身份验证返回错误-Javascript SDK,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52350509/

10-11 15:07