Начинаю пет-проект на Rails 8.0, попробовал bin/rails generate authentication. Сгенерировалось немного: модели User и Session, concern Authentication, контроллеры входа и сброса пароля. Регистрации нет, подтверждения почты нет. В Laravel я привык к готовому пакету, тут уже привык к Devise. Стоит ли возиться с генератором или проще поставить Devise, как всегда?
Для нового проекта я бы взял генератор. Главный плюс: это обычный код в твоём репозитории, его можно прочитать целиком за полчаса. В Devise, когда надо что-то поменять в потоке входа, полдня уходит на то, чтобы понять, какой модуль и какой хук переопределять. Вход там выглядит так:
class SessionsController < ApplicationController
allow_unauthenticated_access only: %i[new create]
rate_limit to: 10, within: 3.minutes, only: :create
def create
if user = User.authenticate_by(params.permit(:email_address, :password))
start_new_session_for user
redirect_to after_authentication_url
else
redirect_to new_session_path, alert: "Неверный email или пароль"
end
end
end
authenticate_by появился в 7.1, он тратит одинаковое время и на верный пароль, и на несуществующий email. Сессии хранятся в таблице, поэтому «выйти на всех устройствах» это просто удалить записи. Регистрация это один контроллер строк на двадцать. Чего нет: подтверждения почты, блокировки после неудачных попыток, входа через сторонние сервисы. Если всё это нужно с первого дня, Devise по-прежнему разумный выбор.
Полдня в Devise это прямо про меня: искала, где менять редирект после входа, оказалось after_sign_in_path_for в ApplicationController
Я бы ещё смотрел, кто будет поддерживать. Devise знает любой, кто пришёл с рынка, про него спрашивают на собеседованиях. Самописную аутентификацию, даже сгенерированную, каждый новый человек читает с нуля, а правки в ней надо ревьюить строже: безопасность на совести команды, а не мейнтейнеров гема. Для пет-проекта генератор отлично, для команды я бы взвешивал.
Генератор не про API, имейте в виду: он под куки и обычные формы. Для мобилки токены всё равно придётся дописывать
Убедили, для пет-проекта беру генератор. Регистрацию дописал за вечер: контроллер, форма, start_new_session_for после создания. Подтверждение почты сделал через generates_token_for :email_confirmation, expires_in: 2.days, тоже из 7.1, очень удобно. Неудачные попытки входа пока закрывает rate_limit из того же генератора, для пет-проекта хватает. Поправить пришлось только письмо сброса пароля: оно по умолчанию на английском, перевёл шаблон и тексты в контроллере. На Laravel это был бы пакет, а тут сорок строк своего кода.