Какая сущность в symfony security и Lexik JWT Bundle проверяет логин/пароль при входе?
Здравствуйте, сразу опишу задачу: необходимо написать свой сервис, который будет проверять логин пароль юзера(как в api/login_check при использовании Lexik JWT Bundle) и возвращать стандартный jwt токен.
Задача минимум - понять, как работает security и Lexik JWT, задача максимум, реализовать проверку логин/пароль своим классом и встроить в security.
Но я не могу понять, кто конкретно проверяет логин пароль в Lexik JWT Bundle. Пока удалось отследить маршрут до Symfony\Component\Security\Http\Authenticator\JsonLoginAuthenticator, метод authenticate, который возвращает Passport(внутри есть логин, пароль, и другие параметры из входящего json) и onAuthenticationSuccess, в котором уже сгенерирован jwt токен.
Отсюда следующие вопросы:
1) Кто проверяет логин-пасс между authenticate и onAuthenticationSuccess в JsonLoginAuthenticator
2) Как вообще стоит действовать, если нужна своя проверка логина и пароля. Пароль тут условно, допустим пароль нужно заменить на другое поле, аля код смс. Но речь не про двухфакторную авторизацию. И не проверку апи ключа на каждом запросе.
Зачем вам разбираться, как работает сложный бандл. Вам нужно разобраться как это сделать минимальными усилиями. Могу лишь подсказать как это сделать. Потому что описывать как работает бандл долго и ни к чему.
1. Делаете новый роут и в нем проверяете входящие данные. Если это логин и код из смс, то ищете эту связку в базе и если нашлась, то формируете JWT и отдаете frontend приложению.
2. Делаете Аутентификатор, который берет заголовок токена из запроса, извлекает из него токен и проверяет его на различную валидацию: подпись, срок действия и т д
Ну а дальше если есть вопросы можете написать их в комментариях.
Да, сейчас как раз по первому варианту сделал.
Но мне не нравится, т к у меня два способа входа (логин/пароль и телефон/смс). И получается что все настройки(время жизни, секьюрность, название куки и тд) приходится дублировать в контроллере.
Нашел старый пример и какие то обрывки доки, которая ведет в какой то листнер, но дока старая и в текущей версии симфони сделано не так, как в той доке... Короче пока забросил идею, но разобраться все же хочется, хотя бы на уровне "примерно так"
Александр Афанасьев, это не дублирование настроек. Разные способы входа. А чтобы не дублировать время жизни токена выносите в env или parametrs. Название куки может не быть если у вас фронт не на Symfony. Если же всё таки на Symfony, то название тоже можно выносить. Принцип DRY у вас нарушен. В то же время при разных способах аутентификации он не нарушается. Знания не дублируются.