Node.js 仅 bcrypt 比较问题 return 错误

Node.js bcrypt compare problem only return false

我想用 Node.js 和 MongoDB 登录 API 并且当我将输入的传递与数据库中的传递进行比较时,我总是得到 false 我读了其他post 在 Whosebug 上,但没有帮助我。

我想我也发现了问题:当我在我的密码输入上使用散列来手动检查它时,每个请求都是 onatherone。

所以也许这就是问题所在,但我不知道如何解决。我读了很多关于这个但仍然无法解决这里是我的代码:

const match = await bcrypt.compare(password, user.password, (res) => {console.log(res)}) //false

我的登录api


router.post('/login', body('email').isEmail(), body('password').exists(), async (req, res) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() })
    }

    const { email, password } = req.body

    const user = await User.findOne({ email })

    if (!user) {
        return res.status(401).json({ "err": "invalid credentials" })
    }

    // const match = await bcrypt.compare(password, user.password).then(function (res) { console.log(res) })

    const match = await bcrypt.compare(password, user.password);

    console.log(match)

})

这是寄存器 api



router.post("/register", body("email").isEmail(), body("password").isLength({ min: 5 }), body("username").isLength({ min: 1 }), async (req, res) => {
    const { email, username, password } = req.body
    const errors = validationResult(req);
    const saltRounds = 10;

    try {
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() })
        }
        //check if the user exist
        const duplicated = await User.findOne({ email })
        if (duplicated) { return res.status(401).json({ "err": "Email is taken" }) }
        const user = new User({ username, email, password })

        //crypt pass
        user.password = bcrypt.hashSync(process.env.secret, saltRounds);

        //generate token with jwt
        const payload = {
            id: user.id
        }

        jwt.sign({
            payload,
        }, process.env.jwtSecret, { expiresIn: '999h' }, (err, token) => { console.log(token) });
        //save the user
        await user.save()
        res.status(200).send("User Stored")

    } catch (error) {
        res.status(500).send(error.body)
    }

})



为此尝试使用 Promise

const match = await new Promise((resolve, reject) => {
  bcrypt.compare(password, user.password, function(error, res){
    if (error) { reject(error); }
    resolve(res);
  })
}) 

你的问题是你使用 bcrypt.hash 的方式不对。 似乎您提供了这种方法的密钥,您不应提供。 此方法接受要散列的值,并且 saltRounds.

所以您基本上需要将注册 API 代码更改为:

router.post("/register", body("email").isEmail(), body("password").isLength({ min: 5 }), body("username").isLength({ min: 1 }), async (req, res) => {
    const { email, username, password } = req.body
    const errors = validationResult(req);
    const saltRounds = 10;

    try {
        if (!errors.isEmpty()) {
            return res.status(400).json({ errors: errors.array() })
        }
        //check if the user exist
        const duplicated = await User.findOne({ email })
        if (duplicated) { return res.status(401).json({ "err": "Email is taken" }) }
        const user = new User({ username, email, password })

        //crypt pass
        user.password = bcrypt.hashSync(password, saltRounds);

        //generate token with jwt
        const payload = {
            id: user.id
        }

        jwt.sign({
            payload,
        }, process.env.jwtSecret, { expiresIn: '999h' }, (err, token) => { console.log(token) });
        //save the user
        await user.save()
        res.status(200).send("User Stored")

    } catch (error) {
        res.status(500).send(error.body)
    }
}

更具体地说,您将密码存储在:

user.password = bcrypt.hashSync(password, saltRounds);