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





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