Sinatra と BCrypt を使用して非常に単純な認証アプローチのように見えるものを実装しようとしていますが、明らかに何かが欠けています...
ユーザーには、db にプレーンテキストで保存される一時パスワードが事前に割り当てられます。
一時パスワードに対して認証を行ってから、salt と password_hash の両方を作成し、それらを文字列として db (この場合は mongo) に書き込みます。
認証するには、db からソルトをフェッチし、ユーザー パスワードを比較します。
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 クラスですが、一致しません)。
ここで何が欠けていますか?洞察力について事前に感謝します!
マルク