Проблема: необходимость авторизации по телефону без SMS-подтверждения
В WooCommerce часто требуется упростить процесс входа, позволяя пользователям авторизоваться по номеру телефона. Однако интеграция SMS-провайдеров может быть дорогой и сложной. Задача — реализовать авторизацию по телефону без отправки SMS, используя только внутренние механизмы WordPress и WooCommerce.
Диагностика: почему стандартные методы не подходят
По умолчанию WooCommerce и WordPress не поддерживают вход по телефону. Попытки заменить email на телефон без дополнительной логики приведут к проблемам:
- Отсутствие проверки владельца номера снижает безопасность.
- Стандартный логин по email не работает с телефонными номерами.
- Плагины SMS-авторизации требуют SMS-провайдеров и не подходят для данной задачи.
Необходимо создать кастомную авторизацию, которая позволит логиниться по телефону, сопоставляя номер с пользователем, и обходить SMS-подтверждение, используя альтернативные способы верификации (например, email, капчу или доверенные устройства).
Решение: пошаговая реализация авторизации по телефону без SMS
1. Добавление поля ввода телефона на страницу входа WooCommerce
Добавим поле для телефона и скроем стандартный email/логин, чтобы пользователь вводил только номер телефона и пароль.
add_action('woocommerce_login_form_start', function() {
echo '<p class="form-row form-row-wide"><label for="phone">Номер телефона</label><input type="text" class="input-text" name="phone" id="phone" autocomplete="tel" /></p>';
});
add_filter('woocommerce_login_form_fields', function($fields) {
unset($fields['username']); // Убираем стандартное поле логина
return $fields;
});2. Переопределение процесса аутентификации по номеру телефона
Создадим функцию, которая будет искать пользователя по мета-данным с номером телефона и выполнять аутентификацию.
add_filter('authenticate', function($user, $username, $password) {
if (empty($_POST['phone'])) {
return new WP_Error('empty_phone', 'Введите номер телефона.');
}
$phone = sanitize_text_field($_POST['phone']);
$user_query = new WP_User_Query(array(
'meta_key' => 'billing_phone',
'meta_value' => $phone,
'number' => 1
));
$users = $user_query->get_results();
if (empty($users)) {
return new WP_Error('invalid_phone', 'Пользователь с таким номером не найден.');
}
$user = $users[0];
if (!wp_check_password($password, $user->user_pass, $user->ID)) {
return new WP_Error('incorrect_password', 'Неверный пароль.');
}
return $user;
}, 20, 3);3. Добавление минимальной валидации номера телефона
Для повышения надежности добавим проверку формата номера телефона перед поиском пользователя.
function is_valid_phone($phone) {
// Пример: только цифры, от 10 до 15 символов
return preg_match('/^\+?\d{10,15}$/', $phone);
}
add_filter('authenticate', function($user, $username, $password) {
$phone = isset($_POST['phone']) ? sanitize_text_field($_POST['phone']) : '';
if (!is_valid_phone($phone)) {
return new WP_Error('invalid_phone_format', 'Неверный формат номера телефона.');
}
// Остальной код как выше
return $user;
}, 10, 3);Проверка результата после внедрения
- Откройте страницу входа WooCommerce — должно отображаться поле «Номер телефона» вместо email.
- Введите номер телефона, который сохранен в мета-поле
billing_phoneпользователя, и правильный пароль — вход должен быть успешным. - Попробуйте ввести неправильный номер или пароль — должны появиться соответствующие ошибки.
- Проверьте, что стандартный вход по email не доступен.
Частые ошибки и их устранение
- Пользователь с номером телефона не найден
Убедитесь, что у пользователя действительно заполнено полеbilling_phoneв WooCommerce и номер совпадает по формату. - Проблемы с форматом номера
Проверьте регулярное выражение в функцииis_valid_phone()и подстройте под ваш формат (с кодом страны, без пробелов и т.д.). - Ошибка пустого телефона
Проверьте, что полеphoneкорректно передается из формы, и что форма не кэшируется. - Конфликты с другими плагинами аутентификации
Отключите сторонние плагины для теста и убедитесь, что приоритет фильтраauthenticateдостаточен (20 или больше).
Практические советы по безопасности и производительности
- Рассмотрите добавление капчи на страницу входа, чтобы минимизировать риск брутфорса при упрощенной авторизации.
- Ограничьте количество попыток входа с одного IP через плагин или собственный код.
- Храните номера телефонов в стандартизированном формате, например, с кодом страны без пробелов, чтобы избежать дубликатов.
- Регулярно проверяйте и обновляйте список пользователей, чтобы исключить неактивные или подозрительные аккаунты.
- Если безопасность критична, можно добавить дополнительный шаг верификации по email после входа по телефону.
Сравнение вариантов реализации авторизации по телефону
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Использование SMS-провайдера | Отправка одноразового кода на телефон | Высокая безопасность, проверка владения | Стоимость и зависимость от внешнего сервиса |
| Авторизация по телефону без SMS (описано в статье) | Поиск пользователя по мета-полю и пароль | Простота и отсутствие расходов | Низкая безопасность, возможно злоупотребление |
| Авторизация через email с телефоном как дополнительным полем | Стандартный вход по email, телефон для уведомлений | Стандартные механизмы безопасности | Не решает задачи входа по телефону |