我正在尝试使用 Sinatra 和 BCrypt 实现看似非常简单的身份验证方法,但显然我遗漏了一些东西......
用户被预先分配了一个临时密码,该密码以明文形式存储在数据库中。
我对临时密码进行身份验证,然后创建一个 salt 和 password_hash 并将它们作为字符串写入数据库(在本例中为 mongo)。
为了进行身份验证,我从数据库中获取盐和用户密码进行比较。
post "/password_reset" do
user = User.first(:email => params[:email], :temp_password => params[:temp_password])
if dealer != nil then
password_salt = BCrypt::Engine.generate_salt
password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)
user.set(:password_hash => password_hash)
user.set(:password_salt => password_salt)
end
end
post "/auth" do
@user = User.first(:email => params[:email])
@user_hash = BCrypt::Password.new(@user.password_hash) #because the password_hash is stored in the db as a string, I cast it as a BCrypt::Password for comparison
if @user_hash == BCrypt::Engine.hash_secret(params[:password], @user.password_salt.to_s) then
auth = true
else
auth = false
end
end
BCrypt::Engine.hash_secret(params[:password], password_salt) 返回的值与存储在数据库中的值不同(两者都属于 BCrypt::Password 类,但它们不匹配)。
我在这里想念什么?非常感谢您的任何见解!
马克