Rails5 API + devise_token_auth редактировать формат токена - PullRequest
0 голосов
/ 04 сентября 2018

, поэтому я использую гем devise_token_auth для основных пользовательских функций, и я внес несколько простых изменений в поток сброса пароля. По сути, вместо ссылки в электронном письме, по которой пользователь может щелкнуть и перейти на страницу сброса, я показываю токен, поэтому пользователи должны скопировать его и ввести вручную в поле.

Это работает так, но токен слишком большой и уродливый, я бы хотел, чтобы это было что-то вроде 6 буквенно-цифровых цифр. Это выглядит лучше, и это делает вещи проще для пользователя. Я не совсем знаю, как это сделать, я, вероятно, должен переписать какой-нибудь оригинальный контроллер. Как это сделать? Поскольку devise_token_auth помещает контроллер «сверху» каждого оригинального контроллера devise, я хочу перезаписать set_reset_password_token из восстанавливаемого модуля devise.

РЕДАКТИРОВАТЬ: Я нашел ответ сам, поэтому я отвечу на него ниже! Но, пожалуйста, не стесняйтесь жаловаться, спрашивать и предлагать лучшие / альтернативные решения.

1 Ответ

0 голосов
/ 04 сентября 2018

Итак, во-первых, если вы хотите перезаписать функцию из модуля devise, вы можете просто написать ее с тем же именем в файле модели, возможно, в models / user.rb. Чтобы перезаписать set_reset_password из восстанавливаемого модуля, вы можете просто сделать следующее (как предложено Серхио Туленцев здесь ):

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :lockable
  ...

  protected
    def set_reset_password_token
      ...
    end
end

Теперь, чтобы перейти к желаемому исходному токену (до того, как он будет зашифрован), в моем случае я хотел, чтобы он имел 6 цифр, содержащих только AZ, az, 0-9 цифр, давайте посмотрим, что делает devise ( ссылка на файл github ):

def set_reset_password_token
  raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)

  self.reset_password_token   = enc
  self.reset_password_sent_at = Time.now.utc
  save(validate: false)
  raw
end

То, что Devise.token_generator.generate ( видно здесь ) делает, генерирует необработанный токен, используя SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz') (длиной 20, как видно здесь ) и возвращает необработанный и зашифрованный токен, если только Некоторому пользователю уже назначен тот же токен.

Наконец, вам нужно переписать этот set_password_token с использованием SecureRandom функций, связанных с tr , для генерации токенов любым удобным вам способом, и не забудьте убедиться, что токен является уникальным и в настоящее время не используется.

...