web-dev-qa-db-ja.com

Cognitoユーザープールでユーザーがパスワードをリセットできるようにするにはどうすればよいですか?

したがって、私のアプリでは、ユーザーにパスワードをリセットする手段を提供したいのは明らかです。私が抱えている問題は、ユーザープールの新しいドキュメントがこのトピックに関してかなりあいまいであることです。パスワードを忘れた場合のフローで行うように指示する内容と、それを見つけるためのリンクを次に示します。

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が定義およびサインインされているプロジェクトにこのコードをドロップしても、何も起こらないようです。確認コードをユーザーに送信し、新しいパスワードを要求することで、このコードを何らかの形で統合する必要があることを理解していますが、これを行う方法については何も見つかりません。考え?

ありがとう

21
Mark Keane

パスワードを忘れた場合のパスワードのリセットフローには、2つの手順があります。

  1. サービスから確認コードを要求してプロセスを開始します。コードがユーザーの電話/メールに配信されます。
  2. 提供された検証コードを使用して新しいパスワードを設定します。

これらの2つの機能を使用して、上記の手順を実行し、パスワードをリセットします。

  1. cognitoUser.forgotPassword() :これは、パスワードを忘れた場合のプロセスフローを開始します。サービスは検証コードを生成し、ユーザーに送信します。 callback.inputVerificationCode(data)を介して返される「データ」は、検証コードが送信された場所を示します。

  2. cognitoUser.confirmPassword() :この関数で提供された検証コードを使用して、新しいパスワードを設定します。

11
M Reddy

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

これと同じ問題がありました。次の方法で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");
    },
});
6
gabriel