Я пытаюсь реализовать то, что кажется очень простой подход аутентификации с использованием Синатра и Bcrypt, но ясно, что я что-то отсутствует ...рубин BCrypt сравнение хэш
Пользователи предустанавливаются временный пароль, который хранится в незашифрованном в дБ.
Я аутентифицируюсь от временного пароля, а затем создаю как соль, так и пароль_hash и записываю их как строки в 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_salt) отличается от того, что хранится в БД (оба класса Bcrypt :: Пароль, но они этого не делают совпадение).
Что мне здесь не хватает? Большое спасибо заранее за любую проницательность!
Марк
благодарю вас так много. Это было именно то, чего я отсутствовал, прекрасно работает. Я могу перестать вытягивать волосы (до следующей вещи). – user1553220
вы могли бы сделать @ user_hash.is_password? params [: password] вместо == ... Я думаю, что это более понятно и подвержено ошибкам, потому что, если вы не знаете, что == был перезаписан и инвертирован порядок сравнения (params [: password] == @user_hash) он вернет false ... – rizidoro