symfony -- Смс регистрация и аутентификация (sms-код). Пример.

Если вы хотите, чтобы на вашем сайте регистрация и аутентификация пользователя происходила по SMS-коду, можно воспользоваться следующим примером.

Здесь генерация sms-кода инициируется ajax-запросом. Код записывается в БД вместе с номером телефона, запросившего код. Далее в контроллере регистрации/логина введённый пользователем код в форму сравнивается с кодом из БД, а также проверяется на временной лимит (код действует 5 минут).
В формах регистрации и аутентификации у вас могут быть различные поля, но обязательно должны присутствовать поле mobileNumber и code

  1. Создаём сущность Code.php:
    <?php
    
    namespace AppBundle\Entity;
    
    use DateTime;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="`code`")
     */
    class Code 
    {
        /**
         * @var int 
         * 
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="SEQUENCE")
         * @ORM\SequenceGenerator(sequenceName="code_id_primary_key")
         */
        private $id;
        
        /**
         * @var srting
         * 
         * @ORM\Column(type="string", name="mobile_number")
         */
        protected $mobileNumber;
    
        /**
         * @var int 
         * 
         * @ORM\Column(type="integer")
         */
        private $value;
        
        /**
         * @var DateTime 
         * 
         * @ORM\Column(type="datetime", name="created_at")
         */
        private $createdAt;
        
        /** @var bool
         * 
         * @ORM\Column(type="boolean", name="is_login")
         */
        protected $isLogin;
  2. AJAX-запрос SendSms.js.
    $(function(){
        ajaxCreateSmsCode();
    });
    
    function ajaxCreateSmsCode()
    {
        $('div.text-link').on('click', function(){
            var mobileN = $('#app_user_registration_mobileNumber').val(); // считываем значение, если это форма регистрации
            if (!mobileN) {
                var mobileN = $('#form_mobileNumber').val(); // считываем значение, если это форма входа
            }
            console.log(mobileN);
            $.ajax({
                url: '/register/generateSmsCode', 
                type: 'POST',
                data: { mobileNumber : mobileN },
                dataType: 'json',
            })
            .done (function(res){
                console.log(res); // Здесь просто всё ок)
            })
            .fail(function(){
                console.log('Ошибка соединения с сервером');
            });
        });
    }

    !!! Не забудьте подключить ваш js-файл в шаблоне html, а также указать jquery в зависимостях проекта.

  3. Обработчик ajax-а (у меня он лежит в файле RegistrationController.php)
    Он генерирует код, записывает его в БД и отправляет смс пользователю.
    /**
         * @Route("/generateSmsCode", name="code")
         * 
         * @param Request $request
         * 
         * @return Response
         */
        public function generateSmsCode(Request $request): Response
        {
            $mobileNumber = $request->get('mobileNumber');
            
            $rand = rand(1000, 9999);
            
            $code = new Code();
            $code->setMobileNumber($mobileNumber);
            $code->setCreatedAt(new DateTime());
            $code->setValue($rand);
            
            $em = $this->getDoctrine()
                            ->getManager();
            $em->persist($code);
            $em->flush();
            
    // Эта строка отправляет смс. Чтобы отправка заработала, необходимо зарегистрироваться на сайте и указать параметры
            file_get_contents('https://smsc.ru');
            
            return new JsonResponse([
                'success' => 1,
                'error' => 0,
                'code' => $rand,
            ]);
    }
  4. Проверка sms-кода в контроллере.
    У меня вынесена в отдельный метод. Вызываем метод там же, где проверяем submit и валидность формы.
    /**
         * @param array $formData содержит данные, которые пользователь ввёл в форму
         * 
         * @return array $data содержит ошибку 'error' или запись о том, что ошибок нет 'success'
         */
        public function isSmsCodeConsist(array $formData): array
        {
            // Достаём код из БД по известному нам мобильному номеру
            $codeFromDataBase = $this->getDoctrine()
                            ->getManager()
                            ->getRepository(Code::class)
                            ->findOneBy([
                                'mobileNumber' => $formData['mobileNumber'],
                                'value' => $formData['code'],
                                'isLogin' => null,
                            ]);
            
            // Если такого кода в базе нет, возвращаем ошибку
            if (empty($codeFromDataBase)) {
                $data['error'] = 'Неверно введён SMS-код';
                
                return $data;
            }
            
            // Проверка, не просрочен ли код
            $createCodeTime = $codeFromDataBase->getCreatedAt();
            $checkTime = (new DateTime())->modify('-5 minutes'); // время действия кода - 5 минут
            
            if ($checkTime > $createCodeTime) { 
                $data['error'] = 'Данный SMS-код уже недействителен. Запросите новый код.';
                
                return $data;
            }
            
            // Если же ошибок не обнаружено
            $codeFromDataBase->setIsLogin(1);
            
            $em = $this->getDoctrine()
                    ->getManager();
            $em->persist($codeFromDataBase);
            $em->flush();
            
            $data['success'] = 'Пользователь идентифицирован';
                    
            return $data;
        }