symfony -- Смс регистрация и аутентификация (sms-код). Пример.
Primary tabs
Если вы хотите, чтобы на вашем сайте регистрация и аутентификация пользователя происходила по SMS-коду, можно воспользоваться следующим примером.
Здесь генерация sms-кода инициируется ajax-запросом. Код записывается в БД вместе с номером телефона, запросившего код. Далее в контроллере регистрации/логина введённый пользователем код в форму сравнивается с кодом из БД, а также проверяется на временной лимит (код действует 5 минут).
В формах регистрации и аутентификации у вас могут быть различные поля, но обязательно должны присутствовать поле mobileNumber и code
- Создаём сущность 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;
- 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 в зависимостях проекта.
- Обработчик 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, ]); }
- Проверка 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; }
- Log in to post comments
- 3726 reads