当我创建用户时(在sinatra中),我这样做
require 'Bcrypt'
post '/users' do
@user = User.new(params[:user])
@user.password_hash = BCrypt::Password.create(params[:password])
p @user.password_hash == params[:password] # this prints TRUE!
@user.save!
session[:user_id] = @user.id
redirect '/'
end
然后当我尝试验证同一个用户时,我得到了这个
post '/sessions' do
@user = User.find_by_email(params[:email])
p @user.id # prints 14
p @user.password_hash # prints correct hash
p @user.password_hash.class # prints String
p BCrypt::Password.new(@user.password_hash).class # prints BCrypt::Password
p params[:password] # prints "clown123"
p BCrypt::Password.new(@user.password_hash) == params[:password] # prints FALSE!
# redirect '/'
end
什么破了? BCrypt文档(不使用数据库)中给出的示例每次都有效。 我的db(postgres)中的某些内容可能会改变password_hash吗?
使用最新版本的bcrypt和ruby 1.9.3(我已经尝试过ruby 2.0以及同样的结果)
答案 0 :(得分:1)
您使用的是什么数据库列类型?您可以尝试不使用数据库并使用会话。以下对我有用,
# app.rb
require 'sinatra'
require 'bcrypt'
enable :sessions
get '/user' do
session[:password_hash] = BCrypt::Password.create(params[:password])
return 'success'
end
get '/session' do
result = BCrypt::Password.new(session[:password_hash]) == params[:password]
return "Result: #{result}"
end
然后在浏览器中
http://localhost:4567/user?password=secret
# => success
http://localhost:4567/session?password=secret
# => Result: true
http://localhost:4567/session?password=invalid
# => Result: false
如果可行,请尝试再次引入数据库,
require 'sinatra'
require 'bcrypt'
# your postgres config here...
get '/pg-user' do
user = User.new(password_hash: BCrypt::Password.create(params[:password]))
user.save!
return 'success'
end
get '/pg-session' do
user = User.last
result = BCrypt::Password.new(user.password_hash) == params[:password]
return "Result: #{result}"
end