3

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

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

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

我创建了一个简单的 GET 路由来尝试了解 BCrypt 库的工作原理,而不将密码存储到数据库中,此路由的目的只是了解如何使用该库:

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 似乎没有根据散列密码验证原始密码。

提前感谢您,任何帮助将不胜感激。

4

1 回答 1

2

您使用 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
于 2015-03-12T10:17:19.583 回答