【问题标题】:AWS Cognito Authentication Returns Error - Javascript SDKAWS Cognito 身份验证返回错误 - Javascript 开发工具包
【发布时间】:2019-02-20 08:40:04
【问题描述】:

我正在使用 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 控制台中看到这一点。但是,我没有收到 result 对象,而是在客户端的 javascript 控制台中收到错误消息:

Uncaught (in promise) TypeError: Cannot read property 'onFailure' of undefined
    at eval (CognitoUser.js:572)
    at eval (Client.js:108)

但是,当我尝试使用 newPassword 代替之前发送的 tempPassword 登录时,我现在能够成功获取包含三个令牌的 resultobject。

所以我知道一切正常,但不是我所期望的。

是什么导致了这个错误?我该如何解决?我想在用户首次使用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;吗?
  • @Apolozeus 是的,我做到了,但由于用户尚未经过身份验证,我无法首先获取 userAttributes。如果有办法获取 userAttributes,那么我会再试一次
  • @Apolozeus 我错误地认为我必须自己检索 userAttributes,所以我之前的推理有缺陷。我的错。但是现在我已经添加了删除 email_verified 属性的行,我仍然得到一个错误。一个稍微不同的错误,但它仍然与 onFailure 函数有关。有什么想法吗?
  • 请同时更新此函数 cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes);到cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this);

标签: javascript amazon-web-services authentication error-handling amazon-cognito


【解决方案1】:

好的,我解决了。问题是我使用的是 ES6 箭头函数。正如 Apolozeus 指出的那样,我需要将 this 传递给 cognitoUser.completeNewPasswordChallenge 函数。但由于 ES6 的行为方式,this 返回未定义。因此,将我的 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 箭头函数在这里工作。不得不解决这个问题真的很烦人。

向阿波罗泽斯大声呼救

【讨论】:

    【解决方案2】:

    请将cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes); 行更新为cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, this) 基本上,this 将确保同一对象内的callback 函数。

    【讨论】:

      猜你喜欢
      • 2016-12-04
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 2016-11-21
      • 2020-09-11
      • 2018-01-29
      • 2015-11-05
      • 2016-01-23
      相关资源
      最近更新 更多