Как лучше разбить логику?
Пытаюсь понять SRP
Давайте думать. Вот есть у вас класс который:
 - занимается аутентификацией пользователя
 - занимается регистрацией пользователя
 - занимается восстановлением пароля
На лицо три сценария использования, три зоны ответственности. Причем каждая из этих фич может быть реализована отдельно друг от друга, отдельно друг от друга протестирована и изменения могут быть в каждой из этих вещей.
С другой стороны, давайте думать дальше. Если мы поместим все эти операции в рамках юзера - то как бы... все клево) юзер умеет менять свой пароль, юзер умеет логиниться, а регистрация - это просто создание нового юзера. То есть с точки зрения ООП все круто, и нам не нужно ломать инкапсуляцию юзера. Да, юзер много чего будет уметь и возможно даже знать о чем-то о чем не особо должен - но это уже решается инверсией зависимостей и делегированием.
Давайте думать дальше... например та же регистрация как минимум требует отдельного класса, который будет содержать логику регистрации. Нам же помимо создания юзера надо email ему отправить, а возможно еще что-то сделать.
p.s. маленький вброс: https://gist.github.com/fesor/33f041e3f362beff8d0e...
Банально: AuthController где существуют нужные методы(но "сброс пароля" я бы вынес в отдельный контроллер)