更新用户密码时如何验证旧密码?

How do i Validate old password while updating user password?

更新新密码时验证旧用户密码的正确方法是什么? 到目前为止,我已经尝试过并且总是出现错误:错误[ERR_HTTP_HEADERS_SENT]:将它们发送到客户端后无法设置headers

我做了什么: 我尝试使用 bcrypt 将 req.body 中的旧密码与用户现有密码进行比较,然后在保存之前使用 bcrypt 进行哈希处理。使用 bcrypt 比较密码给出了上面的错误。根本不比较旧密码,只保存新密码就可以正常工作。

我的代码:

exports.updatePassword = async (req, res) => {
  try {
    const { oldPassword, password } = req.body;

    let updatedPassword = {
      password: password,
    };

    const user = await User.findOneAndUpdate(
      { _id: req.params.userId },
      { $set: updatedPassword },
      { new: true, useFindAndModify: false }
    );
    // validate old password
    bcrypt.compare(oldPassword, user.password, function (err, match) {
      if (!match || err)
        return res.status(400).send('Please enter correct old password');
    });
    //hash password and save user
    bcrypt.genSalt(12, function (err, salt) {
      bcrypt.hash(user.password, salt, (err, hash) => {
        user.password = hash;
        user.save();
        return res.json({user});
      });
    });
  } catch (err) {
    console.log(err);
    return res.status(400).send('Something went wrong. Try again');
  }
};

问题是 updatePassword 函数在您实际处理所有内容之前就结束了。为避免嵌套函数调用和 returns,请使用 bcrypt 提供的 async 方法(另请查看他们关于使用异步与同步的建议)。

关于代码本身,您在检查密码是否有效之前更新了用户密码。您应该从数据库中获取用户,检查当前密码是否匹配,然后才将新的散列密码插入数据库。

exports.updatePassword = async (req, res) => {
  const { oldPassword, password } = req.body;

  try {
    // get user
    const user = await User.findById(req.params.userId);
    if (!user) {
        return res.status(400).send('User not found');
    }

    // validate old password
    const isValidPassword = await bcrypt.compare(oldPassword, user.password);
    if (!isValidPassword) {
        return res.status(400).send('Please enter correct old password');
    }

    // hash new password
    const hashedPassword = await bcrypt.hash(password, 12);

    // update user's password
    user.password = hashedPassword;
    const updatedUser = await user.save();

    return res.json({ user: updatedUser });
  } catch (err) {
    console.log(err);
    return res.status(500).send('Something went wrong. Try again');
  }
};