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 "Неверный код. Попробуйте еще раз.";
}