登录接口异常:输入错误密码仍可成功登录并获取用户数据
问题排查:输入错误密码仍能成功登录的原因
核心错误点
登录逻辑中密码验证步骤未正确处理异步操作,导致密码校验完全失效。
具体原因
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
相关产品推荐
相关产品推荐

