Перейти к основному содержимому

AuthenticationCode

отвечает за полный цикл работы с кодами подтверждения (OTP — One Time Password): валидацию данных, защиту от спама (таймеры), генерацию кодов, их хранение в БД и отправку через SMS или Email.

Класс: Xpage\Core\Facade\AuthenticationCode

Назначение: Централизованное управление кодами подтверждения для аутентификации/регистрации.

Зависимости:

  • Таблица в БД: Xpage\Core\Model\AuthenticationCodeTable.
  • Хелпер настроек: Xpage\Core\Facade\Helper.
  • Модуль «Служба сообщений» (для SMS) и стандартный почтовый модуль.

sendCodeToPhone(string $recipient, string $action)

Метод для отправки кода на телефон.

  • Валидация: Использует битриксовый PhoneNumber\Parser для проверки корректности номера (формат E164, например, +79991234567).
  • Анти-флуд: Вызывает isValidTimer, чтобы пользователь не мог запрашивать SMS чаще, чем раз в 60 секунд.
  • Генерация: Берет длину кода из настроек модуля через Helper.
  • Хранение: Записывает код в таблицу AuthenticationCodeTable (это ORM-сущность проекта).
  • Отправка: Использует стандартные SMS-события Битрикса (Sms\Event). Вам нужно будет создать тип SMS-события XPAGE_CORE_AUTH_CODE_PHONE в админке.

sendCodeToEmail($recipient, $action, $eventName)

Аналог метода для телефона, но для электронной почты.

  • Проверяет email через filter_var.
  • Отправляет письмо через Mail\Event::send.

codeChecking($recipient, $action, $code)

Самый важный метод для проверки того, что ввел пользователь.

  • Нормализация: Если передан телефон, он приводится к единому формату E164, чтобы поиск в базе был точным.
  • Проверка: Ищет последнюю запись в БД для этого адресата и этого действия.
  • Очистка: Если код верный, метод вызывает clearTable, удаляя все старые коды этого пользователя, чтобы их нельзя было использовать повторно.

isValidTimer($recipient, $action) (private)

Смотрит в базу данных на колонку DATETIME. Если с момента последней отправки прошло меньше 60 секунд (PHONE_CODE_RESEND_INTERVAL), метод вернет количество секунд, которое нужно подождать.


Примеры использования

Отправка кода при регистрации

Допустим, пользователь ввел телефон на фронте и нажал «Получить код». В контроллере вызываете:

use Xpage\Core\Facade\AuthenticationCode;

$phone = '+7 (999) 000-11-22';
$action = 'registration'; // Уникальный ключ действия

$result = AuthenticationCode::sendCodeToPhone($phone, $action);

if ($result['status'] === 'success') {
echo "Код отправлен. Повторная отправка через " . $result['data']['timer'] . " сек.";
} else {
// Выведет ошибку: либо номер неверный, либо таймер еще не истек
echo "Ошибка: " . $result['errors'][0]->getMessage();
}

Проверка введенного кода

Когда пользователь получил SMS и ввел 4 цифры в поле:

use Xpage\Core\Facade\AuthenticationCode;

$phone = '+7 (999) 000-11-22';
$codeFromUser = '1234';
$action = 'registration';

$isValid = AuthenticationCode::codeChecking($phone, $action, $codeFromUser);

if ($isValid) {
echo "Код верный! Можно регистрировать пользователя.";
} else {
echo "Неверный код. Попробуйте еще раз.";
}