更改密码路由中的 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)