Rails5 API + devise_token_auth изменить формат токена

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

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

Обновлено: Я сам нашел ответ, поэтому отвечу на него ниже! Но, пожалуйста, не стесняйтесь жаловаться, спрашивать и предлагать лучшие / альтернативные решения.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
373
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, во-первых, если вы хотите перезаписать функцию из модуля 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 цифр, содержащих только цифры A-Z, a-z, 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, для генерации токенов любым удобным вам способом, и не забудьте убедиться, что токен уникален и в настоящее время не используется.

Другие вопросы по теме