【问题标题】:How to allow my user to reset their password on Cognito User Pools?如何允许我的用户在 Cognito 用户池上重置密码?
【发布时间】:2016-11-01 19:29:04
【问题描述】:

所以在我的应用程序中,我显然想为用户提供重置密码的方法。我遇到的问题是用户池的新文档在这个主题上非常模棱两可。以下是他们告诉您如何处理忘记密码流程,您可以在以下链接找到它:

cognitoUser.forgotPassword({
        onSuccess: function (result) {
            console.log('call result: ' + result);
        },
        onFailure: function(err) {
            alert(err);
        },
        inputVerificationCode() {
            var verificationCode = prompt('Please input verification code ' ,'');
            var newPassword = prompt('Enter new password ' ,'');
            cognitoUser.confirmPassword(verificationCode, newPassword, this);
        }
    });

http://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-javascript-examples.html

但是,当我将此代码放入定义并登录 cognitoUser 的项目中时,似乎没有任何反应。我知道我需要以某种方式将此代码与向用户发送验证码并要求他们输入新密码相结合,但找不到任何有关如何执行此操作的信息。想法?

谢谢

【问题讨论】:

  • @ToddHoff 您是否偶然遇到了让您的用户在网站上通过移动设备使用用户池进行身份验证的问题?这两个问题都快把我逼疯了。
  • 抱歉,我无法通过网站进行身份验证。有什么问题?我可能遇到过?我在亚马逊论坛上也有一个问题,他们回答得很好。这是一个假期,所以可能有点慢。
  • @ToddHoff 问题是我实现 Cognito 用户池的 Javascript 网站可以在计算机上正常工作,但是当我从移动设备上继续并尝试登录时,它只会卡在身份验证尝试上,而且永远不会调用 onSuccess 或 onFailure。我可能要试试aws论坛:(谢谢!

标签: javascript amazon-web-services amazon-cognito


【解决方案1】:

AWS 的文档在这个主题上很糟糕(Cognito)。你基本上需要设置cognitoUser,然后调用forgotPassword

export function resetPassword(username) {
    // const poolData = { UserPoolId: xxxx, ClientId: xxxx };
    // userPool is const userPool = new AWSCognito.CognitoUserPool(poolData);

    // setup cognitoUser first
    cognitoUser = new AWSCognito.CognitoUser({
        Username: username,
        Pool: userPool
    });

    // call forgotPassword on cognitoUser
    cognitoUser.forgotPassword({
        onSuccess: function(result) {
            console.log('call result: ' + result);
        },
        onFailure: function(err) {
            alert(err);
        },
        inputVerificationCode() { // this is optional, and likely won't be implemented as in AWS's example (i.e, prompt to get info)
            var verificationCode = prompt('Please input verification code ', '');
            var newPassword = prompt('Enter new password ', '');
            cognitoUser.confirmPassword(verificationCode, newPassword, this);
        }
    });
}

// confirmPassword can be separately built out as follows...  
export function confirmPassword(username, verificationCode, newPassword) {
    cognitoUser = new AWSCognito.CognitoUser({
        Username: username,
        Pool: userPool
    });

    return new Promise((resolve, reject) => {
        cognitoUser.confirmPassword(verificationCode, newPassword, {
            onFailure(err) {
                reject(err);
            },
            onSuccess() {
                resolve();
            },
        });
    });
}

【讨论】:

  • 嗨,当我尝试更改密码时出现以下错误,“InvalidParameterType: Expected params.Username to be a string”
【解决方案2】:

使用忘记密码流程重置密码有两个步骤:

  1. 通过向服务请求验证码来启动该过程。代码将发送到用户的电话/电子邮件。
  2. 使用提供的验证码设置新密码。

使用这两个函数执行上述步骤并重置密码:

  1. cognitoUser.forgotPassword():这将启动忘记密码的流程。该服务生成一个验证码并将其发送给用户。通过callback.inputVerificationCode(data)返回的“data”表示验证码发送到哪里。

  2. cognitoUser.confirmPassword():使用该功能提供的验证码设置新密码。

【讨论】:

  • 这对我不起作用。我收到一条错误消息,说用户已被确认。是否有另一个电话首先使确认无效?
  • “通过向服务请求验证码来启动该过程。代码将发送到用户的电话/电子邮件。”如果不包含用户名/电子邮件,它如何知道发送到哪里?
【解决方案3】:

我也有同样的问题。能够通过以下方式使用 confirmPassword() 来解决它。

//validation of input from form
req.checkBody('email', 'Username is required').notEmpty();
req.checkBody('password', 'Password is required').notEmpty();
req.checkBody('confirmationcode', 'Confirmation Code is required').notEmpty();


var confirmationCode = req.body.confirmationcode;
var password = req.body.password;
var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);


var userData = {
    Username: req.body.email,
    Pool: userPool
};
var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

cognitoUser.confirmPassword(confirmationCode, password, {
    onFailure(err) {
        console.log(err);
    },
    onSuccess() {
        console.log("Success");
    },
});

【讨论】:

    【解决方案4】:

    如果像我一样,你会发现如何使用放大处理这种情况

    import { Auth } from 'aws-amplify';
    
    // Send confirmation code to user's email
    Auth.forgotPassword(username)
        .then(data => console.log(data))
        .catch(err => console.log(err));
    
    // Collect confirmation code and new password, then
    Auth.forgotPasswordSubmit(username, code, new_password)
        .then(data => console.log(data))
        .catch(err => console.log(err));
    

    https://docs.amplify.aws/lib/auth/manageusers/q/platform/js#forgot-password

    【讨论】:

      【解决方案5】:

      所以即使我遇到了同样的问题,即使在 AWS cognito 文档中也不清楚,基本上这个过程涉及两个步骤。

      1. 调用 cognitoUser.forgotPassword() 将启动忘记密码流程,用户将收到验证码。
      2. 然后调用 cognitoUser.confirmPassword() 将重置密码验证代码发送到用户的电子邮件。

      下面我给出了一个 cognitoUserClass(Typescript),它有实现这两个步骤的静态方法 forgotPassword() 和 confirmPassword() 方法。

      import * as AmazonCognitoIdentity from 'amazon-cognito-identity-js'
      
      class cognitoUserClass {
          static cognitouser: AmazonCognitoIdentity.CognitoUser
          static userPool = new AmazonCognitoIdentity.CognitoUserPool({
              UserPoolId: 'your pool id',
              ClientId: 'your client id',
          })
          static forgotPassword(userName: string): void {
              const userData = {
                  Username: userName,
                  Pool: cognitoUserClass.userPool,
              }
              cognitoUserClass.cognitouser = new AmazonCognitoIdentity.CognitoUser(
                  userData
              )
      
              cognitoUserClass.cognitouser.forgotPassword({
                  onSuccess: (data) => {
                      console.log(data)
                  },
                  onFailure: (err) => {
                      console.log('ERR:', err)
                  },
              })
          }
          static confirmPassword(
              verificationCode: string,
              newPassword: string
          ): void {
              cognitoUserClass.cognitouser.confirmPassword(
                  verificationCode,
                  newPassword,
                  {
                      onFailure(err) {
                          console.log(err)
                      },
                      onSuccess(data) {
                          console.log(data)
                      },
                  }
              )
          }
      }
      
      export { cognitoUserClass }
      

      【讨论】:

        猜你喜欢
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 2019-05-19
        • 2018-07-19
        相关资源
        最近更新 更多