NestJS+Passport登录验证中Bcrypt.compare始终返回true问题
问题分析与解决
核心问题
你的代码存在两个关键错误,导致bcrypt.compare始终“返回true”:
bcrypt.compare是异步方法,它返回的是Promise对象而非直接的布尔值。在if条件判断中,任何对象都会被强制转为true,所以无论密码是否匹配,条件都会成立。- 你把对比的明文密码写成了硬编码的字符串
'pass',而非传入的变量pass,这直接导致对比逻辑完全错误。
修复后的代码
async validateUser(username: string, pass: string): Promise<any> { const user = await this.usersService.findOne(username); // 用await等待compare的异步结果,同时使用变量pass作为明文密码 if(user && await bcrypt.compare(pass, user.password)) { const { password, ...result } = user; console.log(pass, user.password); return result; } return null; }
补充说明
bcrypt.compare必须通过await或.then()获取实际的布尔结果,不能直接在条件中使用Promise对象。- 确保注册用户时,你是用
bcrypt.hash正确生成哈希密码并存储的,否则即使对比逻辑正确,也会出现验证失败的情况。
内容的提问来源于stack exchange,提问作者Damian Kowalski
相关产品推荐
相关产品推荐

