当前位置: 首页 > 知识库问答 >
问题:

Node.js bcrypt比较问题仅返回false

齐琦
2023-03-14

我想用node.js和MongoDB做我的登录API,当我比较我的输入和db中的传递时,我总是得到false,我读了其他关于StackOverFlow的文章,但没有帮助我。

我想我也发现了问题:当我对密码输入使用哈希来手动检查它时,在每个请求中来自db的是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)

})

下面是register 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)
    }

})



共有2个答案

庄高谊
2023-03-14

您的问题是以错误的方式使用了 。似乎您提供了这种方法类型的密钥,但您不应该提供这种密钥。此方法接受hash的值和

因此您基本上需要将注册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);
丁韬
2023-03-14

尝试为此使用

const match = await new Promise((resolve, reject) => {
  bcrypt.compare(password, user.password, function(error, res){
    if (error) { reject(error); }
    resolve(res);
  })
}) 
 类似资料:
  • 我读到这些方法返回值的规则是,对于obj1.compareTo(ob2),例如,如果ob2在层次结构中位于ob1之下,则返回值为负值,如果它位于ob1之上,则返回值为正(如果它等于,则返回值为0)。然而,在我的类中,我看到了使用Math.signum在compareTo方法中获得-1(表示负值)和1(表示正值)的示例。 有什么原因吗? 编辑: 以下是我的意思:

  • 问题内容: 比较器内部的返回值实际上是什么意思? 例如 : 如果返回类型为1,则其实际返回 [20、10、30、100] 如果返回类型为-1,则其实际返回 [100,30,10,20] 如果返回类型为0,则其实际返回 [20] 请告诉我这表示什么? 问题答案: 返回值(不是类型是)告诉调用者(对数据进行排序的事物): 如果始终为比较器返回相同的值(o,1,-1),而不管其输入如何,那么您使用的是错

  • 问题内容: 我在MySQL数据库架构中引入浮点列时遇到了一个问题,即对浮点值的比较不会总是返回正确的结果。 1-50.12 2-34.57 3-12.75 4-…(其余均小于12.00) 这将返回“ 3”。 我已经读过,在MySQL中比较浮点值是一个坏主意,十进制类型是更好的选择。 我是否有希望继续使用float类型,并使比较正常工作? 问题答案: 您是否注意到以下问题? 在某些行之间有一个额外的

  • 问题内容: 当我比较具有相同下划线字符串的两个StringBuilder对象时,即使value应该为true也会返回。 问题答案: 这是因为不会覆盖类中的方法。 您将必须将两个对象都转换为,然后进行比较 这将为您提供正确的结果。显然,您必须注意 null 检查等。 根据合同,如果覆盖equals,则也必须覆盖它们,但是由于可变,因此其值的任何更改都会影响对象的哈希码。如果用作键,可能会导致存储的值

  • 我被难倒了,试图让我的密码成功地与bcrypt使用node进行比较。也许我错过了什么,但是在创建帐户时,我在signup方法中执行了以下操作(有些代码被缩写): 一切正常。我的数据库有加密密码。但当用户登录时,我无法从bcrypt获得成功的结果。比较: 而我总是以无效的密码结束。在与我从数据库中提取的密码进行比较之前,我是否需要获取明文密码并重新加密它?

  • 我怎样才能比较这两个数组,以一种我想返回另一个数组的方式,它包含B中的所有a的值? 返回数组: 来自答案的C#代码:

  • 问题内容: 我的JSON有问题。它可以在PHP 5.3中正确返回(因此我不能使用json_last_error()),并且在我将字符串显式复制到json_decode(json_decode(’{…}’)中时成功返回。结果作为变量,我正在使用php 5.2,这是我需要的。 输出来自PHPUnit中的JSON日志记录: 编辑:这些是我一直在探索的路径-也许您是一个更好的探索者。.三种可能的路径可以帮