ユーザーを作成するとき(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 ドキュメント (データベースを使用しない) に示されている例は、毎回機能します。データベース (postgres) の何かが password_hash を変更している可能性はありますか?
最新バージョンの bcrypt と ruby 1.9.3 を使用 (同じ結果で ruby 2.0 以降も試しました)