更改密码路由中的 Bcrypt 参数错误(如果之前未使用过新密码)
Bcrypt argument error in change password route (if new password has not been used before)
我正在创建一个路由,用户可以在其中创建一个新密码,只要他们之前没有使用过。
我这样做的方法是在用户创建帐户或修改密码后将散列密码添加到 'usedPassword' 数组。
然后在我的更改密码路由中,我正在散列他们的新密码,然后将它与 userPassword 数组中的所有散列密码进行比较,看是否匹配,如果匹配,我将向用户发送错误提示他们不能为他们的新密码使用相同的密码。
如果没有匹配,我清除他们所有的 JWT 令牌,将 newPassword 分配给 user.password(自动哈希,添加到 usedPassword 数组,并用中间件保存),最后创建一个新令牌(将其保存为中间件)并发送回客户端以在钥匙串中更新。
尝试将 hashedNewPassword 与我的 userPasswords 数组中每个以前使用的(散列)密码进行比较时,出现以下错误:
../node_modules/bcrypt/bcrypt.js:137
错误=新错误('data and salt arguments required');
^
我在哪里缺少参数以便我可以将 hashedNewPassword 与我的 usedPasswords 数组中的每个散列密码进行比较?
谢谢!
更改密码路由
router.patch("/api/user/change-password", auth, async (req, res) => {
try {
const user = req.user
// hash newPassword to see if it has been used before in usedPassword array
const hashedNewPassword = await bcrypt.hash(user.newPassword, 10)
user.usedPasswords.forEach(async (password) => {
const match = await bcrypt.compare(password, hashedNewPassword)
if (match) {
throw new Error(`You have already used this password`)
}
})
// if no match, empty user's JWT tokens
user.tokens = []
// by assigning newPassword a pre(`save`) middleware will bcrypt hash the password
user.password = user.newPassword
await user.save()
// make new token and save to user.tokens array with middleware
const token = await user.generateAuthToken()
res.send(token)
} catch (err) {
res.status(500).send(err)
}
})
哈希文本密码预中间件并推送到user.usedPassword(数组)
userSchema.pre(`save`, async function (next) {
const user = this
if (user.isModified(`password`)) {
user.password = await bcrypt.hash(user.password, 10)
user.usedPasswords.push(user.password)
}
next()
})
生成新令牌并保存
userSchema.methods.generateAuthToken = async function () {
const user = this
const token = jwt.sign({ _id: user._id.toString() }, process.env.JWT_SECRET, {
expiresIn: "7 days",
})
user.tokens = user.tokens.concat({ token })
await user.save()
return token
}
user.usedPasswords.forEach(async (password) => {
const match = await bcrypt.compare(password, hashedNewPassword)
这是错误的。您正在散列新密码,然后尝试将新散列与已用密码散列列表进行比较。
您不需要为此检查预先散列新密码。
user.usedPasswords.forEach(async (password) => {
// check the new password against previous passwords
const match = await bcrypt.compare(user.newPassword, password)
我正在创建一个路由,用户可以在其中创建一个新密码,只要他们之前没有使用过。
我这样做的方法是在用户创建帐户或修改密码后将散列密码添加到 'usedPassword' 数组。
然后在我的更改密码路由中,我正在散列他们的新密码,然后将它与 userPassword 数组中的所有散列密码进行比较,看是否匹配,如果匹配,我将向用户发送错误提示他们不能为他们的新密码使用相同的密码。
如果没有匹配,我清除他们所有的 JWT 令牌,将 newPassword 分配给 user.password(自动哈希,添加到 usedPassword 数组,并用中间件保存),最后创建一个新令牌(将其保存为中间件)并发送回客户端以在钥匙串中更新。
尝试将 hashedNewPassword 与我的 userPasswords 数组中每个以前使用的(散列)密码进行比较时,出现以下错误:
../node_modules/bcrypt/bcrypt.js:137 错误=新错误('data and salt arguments required'); ^
我在哪里缺少参数以便我可以将 hashedNewPassword 与我的 usedPasswords 数组中的每个散列密码进行比较?
谢谢!
更改密码路由
router.patch("/api/user/change-password", auth, async (req, res) => {
try {
const user = req.user
// hash newPassword to see if it has been used before in usedPassword array
const hashedNewPassword = await bcrypt.hash(user.newPassword, 10)
user.usedPasswords.forEach(async (password) => {
const match = await bcrypt.compare(password, hashedNewPassword)
if (match) {
throw new Error(`You have already used this password`)
}
})
// if no match, empty user's JWT tokens
user.tokens = []
// by assigning newPassword a pre(`save`) middleware will bcrypt hash the password
user.password = user.newPassword
await user.save()
// make new token and save to user.tokens array with middleware
const token = await user.generateAuthToken()
res.send(token)
} catch (err) {
res.status(500).send(err)
}
})
哈希文本密码预中间件并推送到user.usedPassword(数组)
userSchema.pre(`save`, async function (next) {
const user = this
if (user.isModified(`password`)) {
user.password = await bcrypt.hash(user.password, 10)
user.usedPasswords.push(user.password)
}
next()
})
生成新令牌并保存
userSchema.methods.generateAuthToken = async function () {
const user = this
const token = jwt.sign({ _id: user._id.toString() }, process.env.JWT_SECRET, {
expiresIn: "7 days",
})
user.tokens = user.tokens.concat({ token })
await user.save()
return token
}
user.usedPasswords.forEach(async (password) => {
const match = await bcrypt.compare(password, hashedNewPassword)
这是错误的。您正在散列新密码,然后尝试将新散列与已用密码散列列表进行比较。
您不需要为此检查预先散列新密码。
user.usedPasswords.forEach(async (password) => {
// check the new password against previous passwords
const match = await bcrypt.compare(user.newPassword, password)