Руби и Синатра не могут сравнить хешированный пароль с BCrypt
Я занимаюсь разработкой простого приложения для аутентификации на Ruby с помощью Sinatra и DataMapper.
Я успешно реализовал метод хеширования пароля, когда пользователи регистрируются, но я не могу заставить работать маршрут аутентификации, он просто не сопоставляет предоставленный пароль с хешированной версией, сохраненной в БД (MySQL).
После прочтения большого количества документации, множества вопросов о стекопереработке и еще раз документации, я здесь прошу вашей помощи.
Я создал простой маршрут GET, чтобы попытаться понять, как работает библиотека BCrypt, без сохранения пароля в БД. Цель этого маршрута - просто понять, как использовать библиотеку:
get "/test" do
password_hash = BCrypt::Password.create("wazz")
password = "wazz"
puts password_hash
if BCrypt::Password.new(password_hash).is_password? password
status 201
end
halt(500, {error: password_hash}.to_json)
end
Таким образом, в основном все, что мне нужно сделать, это отправить запрос GET в /test, и все должно быть сделано, но это не так, BCrypt::Password.new, похоже, не проверяет исходный пароль против хешированного.
Заранее спасибо, любая помощь будет очень признательна.
1 ответ
Вы используете bcrypt, но программа работает неправильно. Самое главное, призыв к status 201
не выходит из контроллера в этот момент, он продолжается, так что вы настроили так, что работа bcrypt не имеет значения.
Сделайте что-то вроде этого:
get "/test" do
password_hash = BCrypt::Password.create("wazz")
password = "wazz"
unless BCrypt::Password.new(password_hash).is_password? password
halt(500, {error: password_hash}.to_json)
end
status 201
{message: 'Session created'}.to_json
end