【问题标题】:Problem with password hashing in Express.jsExpress.js 中的密码散列问题
【发布时间】:2021-08-29 07:10:05
【问题描述】:

有人可以帮我处理散列密码吗?在我添加 bcrypt 之前,我在我的 express 应用程序中进行了登录/注册。当我注册用户时,在数据库中我可以看到密码是散列的。但是当我尝试使用普通密码登录时,我总是得到密码无效的错误。我认为我的 comparePassword 方法有问题,但我看不到在哪里。发送一些我的代码的图片。

User.js 文件:

AuthController.js 文件:

我希望这就是我必须发送的全部内容,如果没有,请询​​问我更多信息。

谢谢!

【问题讨论】:

标签: javascript node.js express hash bcrypt


【解决方案1】:

这就是您定义comparePassword()的方式

User.prototype.comparePassword=function(password){
     return bcrypt.compareAsync(password,this.password)
}

问题在于使用“this”关键字。函数内部的“this”指的是函数所属的对象。在您的代码中,您在 login() 中调用 AuthController.js 文件。在login() 内部,函数“this”将引用global 对象,并且由于global 对象内部没有定义密码this.password 将返回未定义。

在调用isPasswordValid 之前,您可以测试它console.log(this.password),它将返回未定义。而是像这样定义comparePassword

User.prototype.comparePassword=function(password,savedPassword){
     return bcrypt.compareAsync(password,savedPassword)
}

所以isPasswordValid应该是这样的:

 const isPasswordValid=await user.comparePassword(password,user.password)

已编辑:

移除 beforeSave 或 beforeCreate 挂钩。看起来它正在对哈希密码进行哈希处理。

【讨论】:

  • 您好,感谢您的回复。我尝试了你的建议,但我仍然得到相同的回应。我在调用 if(!isPasswordValid) 之前 console.log(user.password).. 我得到了注册用户后得到的相同密码,但 isPasswordValid 仍然是假的,我不知道为什么。我尝试这样做:if(isPasswordValid) {...}.. 发送登录请求后,我用 jwt 令牌和所有内容返回用户.. 但是当然,我可以使用任何密码,响应将登录成功
  • 当我尝试 console.log 密码和 user.password 时,密码就像 admin12345 和 user.password 是这个的哈希版本.. 那么我应该如何解决这个问题?
  • @maiiKy 应该是这样的。你不需要修复任何东西。删除 beforeSave 或 beforeCreate 挂钩。看起来它正在对哈希密码进行哈希处理。
  • 非常感谢!我尝试评论 beforeCreate,然后 beforeSave 钩子,但没有发生任何事情。然后我在 server.js 中使用了 sequelize.sync({ force: true }) 但之后我每次都收到我的表不存在的错误。我创建了新数据库并在 .env 文件中更改了它的名称。然后我注册了管理员和一个用户,我可以登录了。再次感谢你!..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2014-05-25
  • 1970-01-01
  • 2016-12-04
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多