Как сделать правильно прерывание скрипта php на сервере, чтобы получить действия пользователя?
Делаю веб-приложение с клиентской и серверной частью на Symfony 4.
Есть задача сделать авторизацию пользователя с двухфакторной аутентификацией по api.
Пример: человек вводит логин и пароль, нажимает кнопку Войти, данные формы уходят на сервер (по Ajax), на сервере запускается скрипт авторизации, устанавливается сессия, и если стоит двухфакторная авторизация, то требуется ввести код. Причём код надо ввести строго в текущей сессии, варианта сохранить сессию и продолжить потом нет.
Надеюсь что правильно объяснил суть :)
Как правильно это реализовать?
Пока что придумал такой вариант:
1. пользователь заполнил форму и отправил данные на сервер, ему появляется индикатор загрузки
2. на сервер пришли данные, запускаем цикл с тайм-аутом, например 1 минуту
3. в базу заносим информацию, что есть запрос на авторизацию, ждём ответ
4. запускаем скрипт авторизации, доходим до ввода смс, в базу заносим инфу что требуется смс
5. Запускаем цикл ожидания 5 минут, проверяя, нет ли кода смс от пользователя
6. Скрипт из шага 2 увидел, что требуется смс код, отправляет Ajax ответ на клиента
7. Пользователю показывается форма с вводом СМС кода, он ее заполняет и отправляет, рисуем дальше загрузку для пользователя
8. На сервере получаем смс код, записываем его в базу
9. Скрипт с циклом из пункта 5 видит, что есть смс код, цикл прерывается и отправляется по апи.
10. Дальше ответ либо успех, либо провал: также по Ajax отправляем пользователю.
Правильно ли я придумал решение? Может быть в symfony есть встроенные механизмы для таких задач?
Мне кажется всё проще надо делать
- пользователь вводит логин/пароль в форме, форма отправляется на сервер (неважно ajax или обычный post запрос)
- если для пользователя включена двухфакторная авторизация, то сервер генерирует случайное число и пишет его в таблицу с пользователем в отдельное поле (дополнительно можно записать срок истечения этого кода в 5 минут). При этом пользователю после отправки формы из предыдущего пункта показывается новая форма с вводом кода (либо оверлеем/модалкой, либо на отдельной странице, в зависимости от способа отправки формы)
- Пользователь вводит код из смс во вторую форму, отправляет на сервер, сервер проверяет совпадение кода (и дополнительно срок истечения этого кода). Если всё ок - авторизовываем пользователя.
Никаких сессий не надо крутить и тем более вешать какие-то скрипты и что-то ожидать и проверять