bcrypt / Mongoose изменить пароль пользователя

#javascript #node.js #mongodb #mongoose #bcrypt

#javascript #node.js #mongodb #mongoose #bcrypt

Вопрос:

Я пытаюсь добавить опцию смены пароля на панель инструментов, которую я создал. В моей форме есть три входа: currentPassword, NewPassword, confirmNewPassword. Это ваша стандартная проверка текущего пароля по базе данных, если он совпадает, затем обновите его новым паролем.

Независимо от того, что я делаю, я не могу заставить код запускаться при успешном совпадении (код после bcrypt.compare). Я знаю, что использую правильный пароль. Я не могу понять, что я делаю не так. Ценю помощь.

 router.post("/changepassword", ensureAuthenticated, (req, res) => {
    const { currentPassword, newPassword, confirmNewPassword } = req.body;
    const userID = req.user.userID;
    let errors = [];

    //Check required fields
    if (!currentPassword || !newPassword || !confirmNewPassword) {
        errors.push({ msg: "Please fill in all fields." });
    }

    //Check passwords match
    if (newPassword !== confirmNewPassword) {
        errors.push({ msg: "New passwords do not match." });
    }

    //Check password length
    if (newPassword.length < 6 || confirmNewPassword.length < 6) {
        errors.push({ msg: "Password should be at least six characters." });
    }

    if (errors.length > 0) {
        res.render("changepassword", {
            errors,
            name: req.user.name,
        });
    } else {
        //VALIDATION PASSED
        //Ensure current password submitted matches
        User.findOne({ userID: userID }).then(user => {
            //encrypt newly submitted password
            bcrypt.compare(currentPassword, user.password, (err, isMatch) => {
                if (err) throw err;
                if (isMatch) {
                    console.log(user.password);
                    //Update password for user with new password
                    bcrypt.genSalt(10, (err, salt) =>
                        bcrypt.hash(newPassword, salt, (err, hash) => {
                            if (err) throw err;
                            user.password = hash;
                            user.save();
                        })
                    );
                    req.flash("success_msg", "Password successfully updated!");
                    res.redirect("/dashboard");
                } else {
                    //Password does not match
                    errors.push({ msg: "Current password is not a match." });
                    res.render("changepassword", {
                        errors,
                        name: req.user.name,
                    });
                }
            });
        });
    }
});
  

Комментарии:

1. Вы должны перенаправить внутри bcrypt.hash обратного вызова

Ответ №1:

Я понял, что это было. const userId должен был быть установлен равным req.user.id . Затем в моем Mongoose find я должен был использовать _id в качестве запроса.

 router.post("/changepassword", ensureAuthenticated, (req, res) => {
const { currentPassword, newPassword, confirmNewPassword } = req.body;
const userID = req.user.id;
let errors = [];
//Check required fields
if (!currentPassword || !newPassword || !confirmNewPassword) {
    errors.push({ msg: "Please fill in all fields." });
}

//Check passwords match
if (newPassword !== confirmNewPassword) {
    errors.push({ msg: "New passwords do not match." });
}

//Check password length
if (newPassword.length < 6 || confirmNewPassword.length < 6) {
    errors.push({ msg: "Password should be at least six characters." });
}

if (errors.length > 0) {
    res.render("changepassword", {
        errors,
        name: req.user.name,
    });
} else {
    //VALIDATION PASSED
    //Ensure current password submitted matches
    User.findOne({ _id: userID }).then(user => {
        //encrypt newly submitted password
        bcrypt.compare(currentPassword, user.password, (err, isMatch) => {
            if (err) throw err;
            if (isMatch) {
                //Update password for user with new password
                bcrypt.genSalt(10, (err, salt) =>
                    bcrypt.hash(newPassword, salt, (err, hash) => {
                        if (err) throw err;
                        user.password = hash;
                        user.save();
                    })
                );
                req.flash("success_msg", "Password successfully updated!");
                res.redirect("/dashboard");
            } else {
                //Password does not match
                errors.push({ msg: "Current password is not a match." });
                res.render("changepassword", {
                    errors,
                    name: req.user.name,
                });
            }
        });
    });
}
  

});

Ответ №2:

Попробуйте использовать синтаксис асинхронного ожидания

 router.post("/changepassword", ensureAuthenticated, async (req, res) => {
  const { currentPassword, newPassword, confirmNewPassword } = req.body;
  const userID = req.user.userID;
  let errors = [];

  //Check required fields
  if (!currentPassword || !newPassword || !confirmNewPassword) {
    errors.push({ msg: "Please fill in all fields." });
  }

  //Check passwords match
  if (newPassword !== confirmNewPassword) {
    errors.push({ msg: "New passwords do not match." });
  }

  //Check password length
  if (newPassword.length < 6 || confirmNewPassword.length < 6) {
    errors.push({ msg: "Password should be at least six characters." });
  }

  if (errors.length > 0) {
    res.render("changepassword", {
      errors,
      name: req.user.name,
    });
  } else {
    //VALIDATION PASSED
    //Ensure current password submitted matches

    User.findOne({ userID: userID }).then(async (user) => {
      //encrypt newly submitted password
      // async-await syntax
      const isMatch = await bcrypt.compare(currentPassword, user.password);

      if (isMatch) {
        console.log(user.password);
        //Update password for user with new password
        bcrypt.genSalt(10, (err, salt) =>
          bcrypt.hash(newPassword, salt, (err, hash) => {
            if (err) throw err;
            user.password = hash;
            user.save();
          })
        );
        req.flash("success_msg", "Password successfully updated!");
        res.redirect("/dashboard");
      } else {
        //Password does not match
        errors.push({ msg: "Current password is not a match." });
        res.render("changepassword", {
          errors,
          name: req.user.name,
        });
      }
    });
  }
});
  

Комментарии:

1. Спасибо, но результаты те же. Независимо от того, что я пытаюсь, он всегда отвечает «Пароль не совпадает».