Руби и Синатра не могут сравнить хешированный пароль с 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
Другие вопросы по тегам