即使密码匹配,bcrypt 也会失败...>

bcrypt fails even when passwords match...>

使用 bcryptjs 比较密码时遇到问题。

环境:

节点:v16.8.0

bcryptjs: 2.4.3

https: 1.0.0 -(站点/页面都是 https,以防有任何区别)。

代码如下所示:

// Login Function
router.post('/login', async (req, res) => {
    const { password, email } = req.body;

    let user = users.find((user) => {
        return user.email === email
    });
    // Checks that the user is already registered
    if (!user) {
        return res.status(400).json({
            "errors": [
                {
                    "msg": "Invalid Credentials"
                }
            ]
        })
    };

    // Compare Passwords
    console.log('Checking if passwords match\n')
    let isMatch = await bcrypt.compare(password, user.password);

    console.log('Displaying Password variables:')
    console.log(`Just password Variable: ${password}`)
    console.log(`User.Password variable: ${user.password}`)

    console.log('\nDisplaying Value of isMatch:')
    console.log(`${isMatch}\n`)

    if (!isMatch) {
        console.log(`The Passwords dont match! Closing Connection`)
        return res.status(400).json({
            "errors": [
                {
                    "msg": "The Passwords do not match!"
                }
            ]
        });
    } else {
        console.log(`Moving on to the JWT thingy`)
        const token = await jwt.sign({
            email
        }, process.env.JWT_SECRET, {
            expiresIn: 360000
        })
        return res.json({ token })
    };
});

这是所有console.logs的输出:


服务器正在端口上运行:3443

检查密码是否匹配 (这是 bcrypt.compare 的部分)

显示密码变量:

只是密码变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS User.Password 变量:$2a$10$mXTzEmSqPoaEsPbvM3P/o.cl7VyMhVq7S37u8Lpo8gGr6i0tS8OxS

isMatch 的显示值: 假

密码不匹配!关闭连接


我只是不明白为什么 isMatch returns 为 false,console.logs 的输出完全相同但是 isMatch returns 的值为 false,因此遵循! isMatch 路由而不是进入 JWT 部分。

我试过使用 bcryptjs.hashSync() 和 bcryptjs.compareSync 但没有区别。

有什么想法吗? 干杯, M.

bcrypt.compare 采用纯文本密码和密码哈希。您的代码传递了两个密码哈希值。所以字符串相等,但是第一个字符串的散列值不等于第二个字符串。

// Login Function

    router.post('/login', async (req, res) => {
        const { password, email } = req.body;
    
        let user = users.find((user) => {
            return user.email === email
        });
        // Checks that the user is already registered
        if (!user) {
            return res.status(400).json({
                "errors": [
                    {
                        "msg": "Invalid Credentials"
                    }
                ]
            })
        };
    
        // Compare Passwords
        console.log('Checking if passwords match\n')
        
    if (password === user.password) {
    
        console.log('Displaying Password variables:')
        console.log(`Just password Variable: ${password}`)
        console.log(`User.Password variable: ${user.password}`)
    
        console.log('\nDisplaying Value of isMatch:')
        console.log(`${isMatch}\n`)
    
        if (!isMatch) {
            console.log(`The Passwords dont match! Closing Connection`)
            return res.status(400).json({
                "errors": [
                    {
                        "msg": "The Passwords do not match!"
                    }
                ]
            });
}
        } else {
            console.log(`Moving on to the JWT thingy`)
            const token = await jwt.sign({
                email
            }, process.env.JWT_SECRET, {
                expiresIn: 360000
            })
            return res.json({ token })
        };
    });

我已将您的代码编辑为 bcrypt.compare,因为如上述答案所述,compare 采用纯文本字符串并将其与 bcrypt 散列的进行比较版本。因此,由于两者都经过哈希处理,因此常规的 if 语句就足够了。如果我把右括号 if 放错地方了请见谅