我们如何散列放置请求密码?
How do we hash a put request password?
大家好,我正在尝试在我的 express-mongoose 服务器中使用 bcrypt 散列我的 put 请求
放置请求
// updating a user
router.put('/:id', async (req, res) => {
const {error} = validate(req.body)
if (error) return res.status(400).send(error.details[0].message)
const user = await User.findByIdAndUpdate(req.params.id, {
$set : {
name: req.body.name,
email: req.body.email,
password: req.body.password
}
})
// hashing user passwords
const salt = await bcrypt.genSalt(10)
user.password = await bcrypt.hash(user.password, salt)
if (!user) return res.status(404).send('User with that id does not exist')
res.send(user)
})
除了散列更新密码外,更新请求中的所有其他功能都运行良好。作为新手,我需要您的帮助/最佳方法推荐。
提前致谢...
解决方案 1:简单方法
对于您个人的解决方案,无需真正修改代码,它的工作原理如下。
// updating a user
router.put('/:id', async (req, res) => {
const {error} = validate(req.body)
if (error) return res.status(400).send(error.details[0].message)
// Why not make the hash function here?
const salt = await bcrypt.genSalt(10)
const newPassword = await bcrypt.hash(req.body.password, salt)
const user = await User.findByIdAndUpdate(req.params.id, {
$set : {
name: req.body.name,
email: req.body.email,
password: newPassword
}
})
if (!user) return res.status(404).send('User with that id does not exist')
res.send(user)
})
您的 user.password
调用有误。 findByIdAndUpdate
方法不是 return 可以立即修改的对象。在上述解决方法中,我们只需移动该函数,以便它在更新您的文档之前先对新密码进行哈希处理。
解决方案 2:我自己的风格
对于我个人的解决方案,我会这样做。假设您有一个 userModel
存储 User
实体的架构。我将添加一个新的中间件,每次密码更改时都会 运行。
/** your user schema code. **/
userSchema.pre('save', async function (next) {
// Only run the encryption if password is modified.
if (!this.isModified('password')) {
return next();
}
// Hash the password with BCRYPT Algorithm, with 12 characters of randomly generated salt.
this.password = await bcrypt.hash(this.password, 12);
next();
});
接下来,我们将创建一个新的专用路由来处理密码更改。我认为最好为它定义一条新路由,因为密码是敏感数据。以下是伪代码,不要马上复制粘贴,这样是不行的。
const user = await User.findById(...);
user.password = req.body.password;
await user.save({ validateBeforeSave: true });
记住 save
中间件 运行s 每次在 save
命令之后是 运行.
进一步阅读 Mongoose 的中间件 here。
大家好,我正在尝试在我的 express-mongoose 服务器中使用 bcrypt 散列我的 put 请求
放置请求
// updating a user
router.put('/:id', async (req, res) => {
const {error} = validate(req.body)
if (error) return res.status(400).send(error.details[0].message)
const user = await User.findByIdAndUpdate(req.params.id, {
$set : {
name: req.body.name,
email: req.body.email,
password: req.body.password
}
})
// hashing user passwords
const salt = await bcrypt.genSalt(10)
user.password = await bcrypt.hash(user.password, salt)
if (!user) return res.status(404).send('User with that id does not exist')
res.send(user)
})
除了散列更新密码外,更新请求中的所有其他功能都运行良好。作为新手,我需要您的帮助/最佳方法推荐。 提前致谢...
解决方案 1:简单方法
对于您个人的解决方案,无需真正修改代码,它的工作原理如下。
// updating a user
router.put('/:id', async (req, res) => {
const {error} = validate(req.body)
if (error) return res.status(400).send(error.details[0].message)
// Why not make the hash function here?
const salt = await bcrypt.genSalt(10)
const newPassword = await bcrypt.hash(req.body.password, salt)
const user = await User.findByIdAndUpdate(req.params.id, {
$set : {
name: req.body.name,
email: req.body.email,
password: newPassword
}
})
if (!user) return res.status(404).send('User with that id does not exist')
res.send(user)
})
您的 user.password
调用有误。 findByIdAndUpdate
方法不是 return 可以立即修改的对象。在上述解决方法中,我们只需移动该函数,以便它在更新您的文档之前先对新密码进行哈希处理。
解决方案 2:我自己的风格
对于我个人的解决方案,我会这样做。假设您有一个 userModel
存储 User
实体的架构。我将添加一个新的中间件,每次密码更改时都会 运行。
/** your user schema code. **/
userSchema.pre('save', async function (next) {
// Only run the encryption if password is modified.
if (!this.isModified('password')) {
return next();
}
// Hash the password with BCRYPT Algorithm, with 12 characters of randomly generated salt.
this.password = await bcrypt.hash(this.password, 12);
next();
});
接下来,我们将创建一个新的专用路由来处理密码更改。我认为最好为它定义一条新路由,因为密码是敏感数据。以下是伪代码,不要马上复制粘贴,这样是不行的。
const user = await User.findById(...);
user.password = req.body.password;
await user.save({ validateBeforeSave: true });
记住 save
中间件 运行s 每次在 save
命令之后是 运行.
进一步阅读 Mongoose 的中间件 here。