7.0 KiB
Вход по SMS через SMSC
Модуль smsc_auth отправляет одноразовый код через SMSC. Проверка кода,
создание пользователя и публичная сессия выполняются ядром AVE.cms. Благодаря
этому отключение или замена SMSC не меняет пользователей и их заказы.
Что получает посетитель
На странице входа появляется форма с телефоном. После отправки сообщения она заменяется полем для кода. Возможны два сценария:
- Телефон уже принадлежит активному пользователю — открывается его профиль.
- Телефона ещё нет — создаётся пользователь сайта в группе регистрации.
Оба сценария используют одну таблицу пользователей. Отдельных «SMS-аккаунтов»
нет. Телефон хранится в международном виде, например +79001234567, и не может
одновременно принадлежать двум профилям.
Подготовка SMSC
- Создайте аккаунт на smsc.ru.
- В кабинете SMSC выпустите отдельный API-ключ для сайта.
- При необходимости зарегистрируйте имя отправителя.
- Пополните баланс и проверьте, разрешена ли отправка на нужные направления.
Логин и пароль кабинета в AVE.cms вводить не нужно. Используйте отдельный API-ключ, который можно отозвать без смены пароля владельца SMSC.
Установка и настройка
- Откройте
Модули -> Управление. - Установите и включите
Вход по SMS (SMSC). - Откройте
Модули -> Вход по SMS. - Вставьте API-ключ и при необходимости имя отправителя.
- Оставьте в тексте SMS тег
{code}. - Сохраните настройки.
- В нижнем блоке отправьте тестовый код на свой номер.
- Включите публичный вход только после успешного теста.
Общая возможность создавать пользователей и их группа настраиваются в
Система -> Пользователи сайта -> Регистрация. Переключатель модуля
Создавать аккаунты может дополнительно запретить регистрацию по телефону,
оставив вход существующих пользователей.
Ограничения кода
| Настройка | Назначение |
|---|---|
| Длина кода | От 4 до 8 цифр. Для обычного сайта рекомендуется 6. |
| Код действует | После этого времени код отклоняется. |
| Повторная отправка | Минимальная пауза перед новым SMS в текущей сессии. |
| Попыток ввода | Сколько неверных вводов разрешено одному challenge. |
| SMS в сутки | Суточный предел для одного номера. |
Дополнительно ядро ограничивает частоту запросов по IP и номеру. Новый код отменяет предыдущий, связан с текущей PHP-сессией и может быть использован только один раз. В базе хранится bcrypt-хеш кода, а не сам код.
Если создание аккаунтов выключено и номер не найден, публичный ответ всё равно выглядит как успешный запрос, но SMS не отправляется. Это не позволяет перебирать зарегистрированные телефоны и не расходует баланс на неизвестные номера.
Секреты и переменные окружения
Настройки по умолчанию находятся в закрытом хранилище
storage/secrets/modules/smsc_auth.php. Их можно переопределить:
SMSC_AUTH_ENABLED=1
SMSC_API_KEY=your-api-key
SMSC_SENDER=AVEcms
Не добавляйте файл секретов и рабочий API-ключ в репозиторий, архив модуля, публичный шаблон или журнал ошибок.
Публичные шаблоны
Системная форма находится в
system/App/Frontend/Auth/view/phone.twig. Для пользовательского шаблона входа
доступен массив phone_providers. Если шаблон его не выводит, AVE.cms добавит
рабочую форму после основной формы входа, поэтому старые темы не ломаются.
Публичные Ajax-адреса:
| Метод и адрес | Назначение |
|---|---|
POST /auth/phone/request |
Нормализует телефон и отправляет код. |
POST /auth/phone/verify |
Проверяет challenge и открывает сессию. |
Оба адреса требуют CSRF-токен. Первый также проходит общую защиту публичных форм и rate limit.
Удаление модуля
При удалении стираются настройки SMSC и история незавершённых кодов. Пользователи, подтверждённые телефоны, заказы и профили сохраняются, потому что это общие данные AVE.cms. Без установленного SMS-провайдера форма входа по телефону просто не показывается.
Подключение другого SMS-провайдера
Новый транспорт реализует
App\Frontend\Auth\Phone\ProviderInterface и регистрирует экземпляр через:
use App\Frontend\Auth\Phone\ProviderRegistry;
ProviderRegistry::register(new MySmsProvider());
Провайдер отвечает только за настройки и отправку sendCode($phone, $code).
Он не должен самостоятельно создавать пользователя, хранить открытый код или
управлять сессией.