如何允许我的用户在Cognito用户池中重置密码?

37

显然,在我的应用程序中,我希望为用户提供重置密码的手段。不过,我遇到的问题是,用户池的新文档在这个主题上非常模糊。以下是他们告诉您如何执行“忘记密码”流程的步骤,以及您可以在哪里找到链接:

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项目中时,似乎没有任何反应。我知道我需要以某种方式将此代码集成到向用户发送验证码并要求他们输入新密码的过程中,但找不到有关如何执行此操作的任何信息。 你有什么想法吗?

谢谢


1
@ToddHoff,你是否遇到过这样的问题:当用户在网站上时,他们无法通过移动设备进行用户池认证?这两个问题都让我疯狂。 - Mark Keane
1
抱歉,我从网站上无法进行任何身份验证。问题出在哪里?我可能遇到了这个问题吗?我还在亚马逊论坛上有一个问题,他们一直很好地回答。由于现在是假期,可能会有点慢。 - Todd Hoff
2
@ToddHoff,问题在于我的JavaScript网站实现了Cognito用户池,从计算机上访问时运行良好,但当我从移动设备上访问并尝试登录时,它只是在身份验证尝试中卡住,从未调用onSuccess或onFailure。我可能不得不尝试AWS论坛:(谢谢! - Mark Keane
6个回答

68
AWS的文档在Cognito这个主题上非常糟糕。你需要设置,然后调用。
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();
            },
        });
    });
}

3
您好,当我尝试更改密码时出现以下错误:“InvalidParameterType:预期参数Username应为字符串”。 - Gaurav Ram

23

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

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

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

  1. cognitoUser.forgotPassword():这将启动忘记密码流程。服务生成验证代码并将其发送到用户。通过回调函数返回的“data”,即callback.inputVerificationCode(data),可以知道验证代码的发送位置。

  2. cognitoUser.confirmPassword():使用发送的验证码和此函数来设置新密码。


1
这对我不起作用。我收到了一个错误,说用户已经确认。是否还有另一个调用可以先使确认失效? - Todd Hoff
2
从服务中请求一个验证代码来开始该过程。系统会将代码发送到用户的手机或者邮箱。如果用户名或者邮箱地址没有包含在请求中,系统如何知道发送到哪里? - Brandon Durham

8

我曾经也遇到过这个问题。后来通过以下方式使用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");
    },
});

2
如果和我一样,你想知道如何使用amplify处理这个案例。
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


0

在获得验证代码后,使用aws-amplify只需按照以下简单步骤即可

import { Auth } from "aws-amplify";

Auth.forgotPasswordSubmit(email, verificationCode, newPassword)
    .then(() => {
        //redirect to sign-in page
    })
    .catch(error => {
        //error logic
    })

0

所以,即使我遇到了同样的问题,即使在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 }

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