You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录接口异常:输入错误密码仍可成功登录并获取用户数据

问题排查:输入错误密码仍能成功登录的原因

核心错误点

登录逻辑中密码验证步骤未正确处理异步操作,导致密码校验完全失效。

具体原因

bcrypt.compare()是异步函数,返回的是Promise对象而非直接的布尔值。你的代码未使用await关键字等待该异步操作完成:

let passwordCompare = bcrypt.compare(password, user.password);

此时passwordCompare是一个Promise实例,在JavaScript中Promise属于"真值",所以!passwordCompare结果永远为false,密码错误的判断逻辑永远不会执行,直接跳过验证生成JWT Token返回,最终导致无论密码正确与否都能登录系统。

修复方案

在bcrypt.compare()前添加await关键字,等待异步操作完成并获取实际布尔值结果:

let passwordCompare = await bcrypt.compare(password, user.password);

修改后的完整登录路由代码片段:

router.post('/login', [
    body('email', 'Enter a valid Email').isEmail(),
    body('password', 'Password cannot be blank').exists()
], async (req, res) => {
    let success=false;
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }
    const { email, password } = req.body;
    try {
        let user = await User.findOne({ email });
        if (!user) {
            return res.status(400).json({success, error: "Please login using correct credentials" })
        };
        // 添加await等待异步密码比对完成
        let passwordCompare = await bcrypt.compare(password, user.password);
        if (!passwordCompare) {
            return res.status(400).json({success, error: "Please login using correct credentials" })
        };
        const data = {
            user: {
                id: user.id
            }
        }
        var authtoken = jwt.sign(data, secret);
        success=true;
        res.json({success, authtoken })
    } catch (error) {
        console.log(error.message);
        res.status(500).send("Internal server error has occured")
    }
})

内容的提问来源于stack exchange,提问作者Rajat Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:40:29