Проблема: необходимость авторизации по телефону без использования SMS-провайдеров
В стандартных решениях WooCommerce и WordPress для авторизации по телефону часто используется отправка SMS с кодом подтверждения от сторонних провайдеров. Это повышает стоимость и сложность настройки, а также вызывает задержки и зависимость от сторонних сервисов. Задача — реализовать авторизацию по телефону без реальной отправки SMS, например, используя одноразовые коды, генерируемые и проверяемые локально, или альтернативные методы подтверждения, чтобы упростить процесс и снизить издержки.
Диагностика проблемы
Перед реализацией важно понять, почему именно SMS-провайдеры не подходят:
- Высокая стоимость SMS
- Проблемы с доставкой сообщений
- Зависимость от сторонних сервисов
- Необходимость работать в условиях отсутствия интернета или ограничений мобильной связи
Если ваша цель — протестировать авторизацию по телефону на этапе разработки или обеспечить локальную двухфакторную аутентификацию, лучше использовать альтернативные методы.
Пошаговое решение: реализация авторизации по телефону без SMS-провайдеров
1. Добавляем поле телефона на страницу входа и регистрации
function wc_add_phone_field() {
woocommerce_form_field( 'billing_phone', array(
'type' => 'tel',
'required' => true,
'label' => __('Телефон'),
'placeholder' => __('Введите номер телефона'),
'class' => array('form-row-wide'),
'priority' => 22,
), '');
}
add_action( 'woocommerce_register_form_start', 'wc_add_phone_field' );
add_action( 'woocommerce_login_form_start', 'wc_add_phone_field' );2. Генерируем одноразовый код и сохраняем его в сессии (без реального SMS)
function wc_generate_otp_code() {
return wp_rand(100000, 999999);
}
function wc_store_otp_code() {
if ( ! session_id() ) {
session_start();
}
$_SESSION['wc_otp_code'] = wc_generate_otp_code();
}
add_action('woocommerce_login_form', 'wc_store_otp_code');В реальном решении код можно показывать на странице или отправлять альтернативным способом (например, email). В данном случае код хранится в сессии для проверки.
3. Добавляем поле для ввода OTP-кода
function wc_add_otp_field() {
woocommerce_form_field( 'otp_code', array(
'type' => 'text',
'required' => true,
'label' => __('Код подтверждения'),
'placeholder' => __('Введите код'),
'class' => array('form-row-wide'),
'priority' => 25,
), '');
}
add_action( 'woocommerce_login_form', 'wc_add_otp_field' );4. Проверяем введённый OTP-код при попытке входа
function wc_validate_otp_code( $username ) {
if ( ! session_id() ) {
session_start();
}
if ( isset($_POST['otp_code'], $_SESSION['wc_otp_code']) ) {
if ( $_POST['otp_code'] !== strval($_SESSION['wc_otp_code']) ) {
return new WP_Error( 'authentication_failed', __('Неверный код подтверждения.'));
}
} else {
return new WP_Error( 'authentication_failed', __('Код подтверждения обязателен.'));
}
return $username;
}
add_filter( 'authenticate', 'wc_validate_otp_code', 30, 1 );Проверка результата после внедрения
- Откройте страницу входа WooCommerce.
- Введите номер телефона и нажмите войти.
- Убедитесь, что сессия создаётся и в ней хранится одноразовый код (можно временно вывести его на экран для теста).
- Введите правильный код OTP — вход должен пройти успешно.
- Введите неправильный код — появится ошибка «Неверный код подтверждения».
Частые ошибки и способы их исправления
- Ошибка: Код подтверждения не сохраняется в сессии.
Причина: Сессия не стартовала или отключена сервером.
Решение: Добавьтеsession_start()в начале хуков и проверьте настройки PHP. - Ошибка: Поля телефона или OTP не отображаются на форме.
Причина: Неправильный хук или приоритет.
Решение: Используйте хукиwoocommerce_register_form_startиwoocommerce_login_formс приоритетом по умолчанию. - Ошибка: Пользователь может войти без ввода кода.
Причина: Проверка OTP не применяется.
Решение: Убедитесь, что фильтрauthenticateдобавлен с приоритетом выше 20 (после проверки имени пользователя и пароля).
Практические советы по безопасности и производительности
- Используйте HTTPS, чтобы защитить передаваемые данные формы.
- Не сохраняйте OTP-код в базе данных — используйте сессии или transient с ограниченным сроком.
- Ограничьте количество попыток ввода OTP с помощью плагинов или собственного кода для предотвращения перебора.
- При необходимости интегрируйте логирование успешных и неуспешных попыток входа.
Сравнение вариантов реализации авторизации по телефону без SMS-провайдеров
| Метод | Плюсы | Минусы |
|---|---|---|
| Одноразовые коды в сессии (локально) | Быстрая настройка, нет зависимости от сервисов | Не подходит для реального подтверждения, подходит только для тестов |
| Отправка кода на Email | Используется существующий канал, бесплатен | Задержка доставки, нужен email у пользователя |
| Генерация QR-кода с временным токеном | Современно, можно интегрировать с приложениями | Сложнее реализовать, требует клиентского ПО |