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

Angular+Express项目登录异常:重置密码后无法登录

问题排查与修复方案

核心错误:登录流程中密码加密逻辑颠倒

你遇到的问题根源在于前端登录时错误地对密码进行了加密,违反了bcrypt的验证逻辑:

  • bcrypt的compareSync(明文密码, 数据库哈希值)方法,是将明文密码与存储的哈希值进行比对(内部会用哈希值中的盐重新加密明文,再对比结果)。
  • 你当前的前端代码在登录时先把密码加密成哈希值传给后端,后端再用这个哈希值作为第一个参数调用compareSync,相当于让bcrypt把哈希值当成明文重新加密,结果必然和数据库中的哈希值不匹配——哪怕两个哈希字符串看起来完全一致。

具体代码问题定位

Angular登录代码中的这一行是罪魁祸首:

formData.userPwd = this.encryptPassword(formData.userPwd);

登录时不需要前端加密密码,直接将用户输入的明文密码传给后端即可。

修复步骤

  1. 修改Angular登录代码
    移除前端加密密码的逻辑,直接提交明文:
logIn(): void {
    if (this.logInForm.valid) {
      const formData = this.logInForm.value;
      // 移除密码加密逻辑:formData.userPwd = this.encryptPassword(formData.userPwd);
      this.httpClient.post('http://localhost:3000/log-in', formData).subscribe(
        (response) => {
          const message = (response as LogInResponse).message;
          this.appendAlert(message, "success", 1);
          this.logInSuccess = true;
        },
        (error: HttpErrorResponse) => {
          this.appendAlert(error.error.message, "danger", 1)
          if (error.error.message.includes('Account locked')) {
            this.logInForm.disable();
            setTimeout(() => this.logInForm.enable(), 300000); // 5 minutes
          }
        }
      );
    }
  }
  1. 验证后端逻辑正确性
    后端的bcrypt.compareSync(userPwd, user.pwd)参数顺序是正确的(明文在前,哈希值在后),无需修改。

额外排查点(若修复后仍有问题)

  • 检查前后端bcrypt版本是否一致:前端用bcryptjs、后端用bcrypt可能存在兼容问题,建议统一使用同一库。
  • 确认数据库pwd字段长度:bcrypt哈希值固定为60字符,确保字段类型为VARCHAR(255)或更长,避免哈希值被截断。
  • 检查密码字符串是否存在隐形字符:比如用户输入或数据库存储时的空格、换行符,可在后端打印userPwd和user.pwd的长度,确认二者完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:57:37