繁体   English   中英

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

[英]How to allow my user to reset their password on Cognito User Pools?

所以在我的应用程序中,我显然想为用户提供重置密码的方法。 我遇到的问题是用户池的新文档在这个主题上非常模糊。 以下是他们告诉您为忘记密码流程执行的操作,以及您可以在以下位置找到的链接:

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

谢谢

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();
            },
        });
    });
}

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

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

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

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

  2. cognitoUser.confirmPassword() :使用此函数提供的验证码设置新密码。

我有同样的问题。 可以通过以下方式使用 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");
    },
});

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

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

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

拿到验证码后,使用aws-amplify就很简单如下

import { Auth } from "aws-amplify";

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM