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

NestJS+Passport登录验证中Bcrypt.compare始终返回true问题

问题分析与解决

核心问题

你的代码存在两个关键错误,导致bcrypt.compare始终“返回true”:

  1. bcrypt.compare是异步方法,它返回的是Promise对象而非直接的布尔值。在if条件判断中,任何对象都会被强制转为true,所以无论密码是否匹配,条件都会成立。
  2. 你把对比的明文密码写成了硬编码的字符串'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:45:49