更新用户密码时如何验证旧密码?
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');
}
};
更新新密码时验证旧用户密码的正确方法是什么? 到目前为止,我已经尝试过并且总是出现错误:错误[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');
}
};