Angular+Express项目登录异常:重置密码后无法登录
问题排查与修复方案
核心错误:登录流程中密码加密逻辑颠倒
你遇到的问题根源在于前端登录时错误地对密码进行了加密,违反了bcrypt的验证逻辑:
- bcrypt的
compareSync(明文密码, 数据库哈希值)方法,是将明文密码与存储的哈希值进行比对(内部会用哈希值中的盐重新加密明文,再对比结果)。 - 你当前的前端代码在登录时先把密码加密成哈希值传给后端,后端再用这个哈希值作为第一个参数调用
compareSync,相当于让bcrypt把哈希值当成明文重新加密,结果必然和数据库中的哈希值不匹配——哪怕两个哈希字符串看起来完全一致。
具体代码问题定位
Angular登录代码中的这一行是罪魁祸首:
formData.userPwd = this.encryptPassword(formData.userPwd);
登录时不需要前端加密密码,直接将用户输入的明文密码传给后端即可。
修复步骤
- 修改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 } } ); } }
- 验证后端逻辑正确性
后端的bcrypt.compareSync(userPwd, user.pwd)参数顺序是正确的(明文在前,哈希值在后),无需修改。
额外排查点(若修复后仍有问题)
- 检查前后端bcrypt版本是否一致:前端用
bcryptjs、后端用bcrypt可能存在兼容问题,建议统一使用同一库。 - 确认数据库
pwd字段长度:bcrypt哈希值固定为60字符,确保字段类型为VARCHAR(255)或更长,避免哈希值被截断。 - 检查密码字符串是否存在隐形字符:比如用户输入或数据库存储时的空格、换行符,可在后端打印
userPwd和user.pwd的长度,确认二者完全一致。
内容的提问来源于stack exchange,提问作者user26627078
相关产品推荐
相关产品推荐

