Mysql Ruby和Sinatra,无法将哈希密码与BCrypt进行比较

Mysql Ruby和Sinatra,无法将哈希密码与BCrypt进行比较,mysql,ruby,hash,ruby-datamapper,bcrypt-ruby,Mysql,Ruby,Hash,Ruby Datamapper,Bcrypt Ruby,我正在用Sinatra和DataMapper开发一个简单的Ruby身份验证应用程序 我已经成功地为用户注册时实现了一个哈希密码方法,但是我无法使身份验证路由正常工作,它只是不匹配提供的密码与哈希版本,存储在DB(MySQL)中 在阅读了大量关于stackoverflow的文档、问题以及更多文档之后,我在这里寻求您的帮助 我创建了一个简单的GET路由,试图了解BCrypt库是如何工作的,而无需将密码存储到db中,此路由的目的只是了解如何使用库: get "/test" do password_

我正在用Sinatra和DataMapper开发一个简单的Ruby身份验证应用程序

我已经成功地为用户注册时实现了一个哈希密码方法,但是我无法使身份验证路由正常工作,它只是不匹配提供的密码与哈希版本,存储在DB(MySQL)中

在阅读了大量关于stackoverflow的文档、问题以及更多文档之后,我在这里寻求您的帮助

我创建了一个简单的GET路由,试图了解BCrypt库是如何工作的,而无需将密码存储到db中,此路由的目的只是了解如何使用库:

get "/test" do
  password_hash = BCrypt::Password.create("wazz")
  password = "wazz"
  puts password_hash
  if BCrypt::Password.new(password_hash).is_password? password
    status 201
  end
  halt(500, {error: password_hash}.to_json)
end
所以基本上我所要做的就是向/test发送一个GET请求,所有的事情都应该完成,但事实并非如此,BCrypt::Password.new似乎没有根据散列密码验证原始密码


提前感谢您,我们将非常感谢您提供的任何帮助。

您使用bcrypt是可行的,但程序流程是错误的。最重要的是,对
status 201
的调用不会在此时从控制器退出,而是继续进行,因此您已经进行了设置,因此bcrypt是否工作无关紧要

改为这样做:

get "/test" do
  password_hash = BCrypt::Password.create("wazz")
  password = "wazz"

  unless BCrypt::Password.new(password_hash).is_password? password
    halt(500, {error: password_hash}.to_json)
  end

  status 201
  {message: 'Session created'}.to_json
end

我看不出你的代码有什么问题,如果我把第一部分剪切粘贴到IRB中,它对我来说是有效的。您能否给出更详细的信息——“所有的事情都应该完成”是什么意思,也就是说,您希望您的代码片段发生什么情况,以及您如何测试它?到底发生了什么?注意:您也可以使用
密码\u散列。是\u密码吗?(密码)
作为测试哦,请稍候,当密码匹配ok时,您调用
状态201
,然后将状态设置回500停止。因此,无论密码发生了什么情况,此代码总是随着服务器错误而停止。bcrypt没有问题,只是你需要颠倒Sinatra路由中的逻辑我希望发生的是,如果a向/test路由发送GET请求,它将生成“wazz”密码的散列,然后将散列与原始密码进行比较,给我一个201状态。谢谢neil,我知道解决方案就在眼前,但我看不到:)我将代码更改为“if password\u hash.is\u password?(password)”,将“else”语句中的暂停移动到“if password\u hash.is\u password?(password)”。非常感谢,现在它起作用了。谢谢尼尔,我不能因为我的低名声而被否决,但你应得的: