Добавление JWT в текущее приложение - PullRequest
0 голосов
/ 18 октября 2018

Я пытался исследовать реализацию JWT в своем приложении и немного запутался.В настоящее время я использую BCrypt для хэша и соли.Мой файл выглядит следующим образом в модели User

class User < ApplicationRecord
  has_secure_password
  validates :username, :email, :password_digest, presence: true
  validates :password, length: { minimum: 6, allow_nil: true }

  attr_reader :password

  after_initialize :ensure_session_token

  def self.find_by_credentials(email, password)
    user = User.find_by(email: email)
    user && user.is_password?(password) ? user : nil
  end

  def self.generate_session_token
    SecureRandom.urlsafe_base64
  end

  def password=(password)
    @password = password
    self.password_digest = BCrypt::Password.create(password)
  end

  def is_password?(password)
    BCrypt::Password.new(self.password_digest).is_password?(password)
  end

  def reset_session_token!
    self.session_token = User.generate_session_token
    self.save!
    self.session_token
  end

  def ensure_session_token
    self.session_token ||= User.generate_session_token
  end
end

Я пытаюсь спросить, нужно ли мне создавать новый метод для дальнейшего шифрования вывода пароля при использовании BCrypt?Как я не могу найти ни одной статьи, где пользователь шифрует пароль пользователя с помощью BCrypt, а затем использует JWT.Все, что я вижу, - это люди, которые упоминают о добавлении BCrypt, добавляя has_secure_password в пользовательскую модель и вместо этого создавая методы хеширования с помощью JWT.

Мой вопрос - заменить BCrypt на JWT или какие рекомендации по защите пароля пользователя с помощью JWT и BCrypt?Кроме того, любые статьи для начинающих будет приветствоваться.

Спасибо за вашу помощь и объяснения.

1 Ответ

0 голосов
/ 18 октября 2018

JWT - это совершенно другой способ по сравнению с методом входа в систему пользователя и использования сеансов и файлов cookie для проверки подлинности будущих запросов.

Если вы думаете, что это так, пользователь заходит в ваше приложение и входит в систему (как обычно, например, с Devise ).Вы получаете их имя пользователя и пароль при входе в систему и проверяете agasint хэш BCrypt в базе данных.Если они успешно войдут в систему, вы предоставите им токен JWT.Внутри этого токена закодирован их идентификатор пользователя.

Когда они делают будущие запросы к вашему приложению (обычно из API), они предоставят токен вместо пароля для имени пользователя.У вашего сервера есть секрет, и он может расшифровать этот токен, чтобы проверить, является ли он действительным, и может затем использовать user_id внутри, чтобы узнать, что это правильный пользователь.Это позволит им получить доступ к любым ресурсам, к которым у них есть доступ.

JWT обычно используется для внешних интерфейсов javascript или приложений для смартфонов, которые хотят иметь длительное время входа в систему (а не сеанс или cookie).Токен также не имеет состояния, поэтому, пока сервер имеет секрет, он может проверить его действительный и расшифровать.

Вот более подробное объяснение: https://github.com/dwyl/learn-json-web-tokens

Вот хорошийруководство по настройке JWT с устройством: https://medium.com/@mazik.wyry/rails-5-api-jwt-setup-in-minutes-using-devise-71670fd4ed03

...