Диагностика задачи: зачем нужна авторизация через SMS без пароля
Традиционная авторизация через логин и пароль часто вызывает сложности у пользователей — забытые пароли, слабая безопасность, неудобство. Авторизация через SMS с одноразовым кодом (OTP) позволяет быстро войти на сайт без пароля, повышая удобство и безопасность. В WordPress с WPForms такую функцию можно реализовать с кастомной интеграцией.
Как работает авторизация через SMS с WPForms
Основная идея: пользователь вводит номер телефона в форму, получает SMS с кодом, вводит код в дополнительное поле, после проверки кода происходит авторизация или регистрация пользователя без пароля.
Требования для реализации
- WPForms Pro для создания кастомных форм с полями;
- SMS-шлюз (например, Twilio, SMS.ru или любой другой с API);
- Навыки PHP для реализации проверки и авторизации;
- Создание и хранение временных одноразовых кодов с ограничением по времени.
Пошаговое решение: создание формы и обработка SMS-авторизации
1. Создание формы с WPForms
Создайте форму с одним полем для номера телефона и кнопкой «Отправить код».
Затем добавьте второе поле — ввод кода с SMS, скрытое по умолчанию.
Можно использовать условную логику WPForms, чтобы второе поле появлялось после отправки первого.
2. Отправка SMS с одноразовым кодом
Добавьте хук wpforms_process_complete в functions.php или плагин для отправки SMS после отправки формы с телефоном:
add_action('wpforms_process_complete', 'send_sms_otp', 10, 4); function send_sms_otp($fields, $entry, $form_data, $entry_id) { $phone = ''; foreach ($fields as $field) { if ($field['name'] === 'Телефон') { $phone = $field['value']; break; } } if (!$phone) return; // Генерация кода $otp = rand(100000, 999999); // Сохраняем код и время в пользовательские метаданные или transient set_transient('otp_' . md5($phone), $otp, 5 * MINUTE_IN_SECONDS); // Отправка SMS (пример для SMS.ru) $api_key = 'ВАШ_API_КЛЮЧ'; $message = "Ваш код для входа: $otp"; $url = "https://sms.ru/sms/send?api_id=$api_key&to=$phone&msg=" . urlencode($message); wp_remote_get($url); }3. Проверка кода и авторизация пользователя
Добавьте обработчик другой формы (или того же шага), где пользователь вводит код. Проверяйте код из transient, если совпадает — авторизуйте или создайте пользователя:
add_action('wpforms_process_complete', 'verify_sms_otp_and_login', 20, 4); function verify_sms_otp_and_login($fields, $entry, $form_data, $entry_id) { $phone = ''; $input_otp = ''; foreach ($fields as $field) { if ($field['name'] === 'Телефон') { $phone = $field['value']; } elseif ($field['name'] === 'Код из SMS') { $input_otp = $field['value']; } } if (!$phone || !$input_otp) return; $stored_otp = get_transient('otp_' . md5($phone)); if ($stored_otp && $stored_otp == $input_otp) { delete_transient('otp_' . md5($phone)); $user = get_user_by('login', $phone); if (!$user) { // Создаем пользователя с логином по телефону $password = wp_generate_password(12, false); $user_id = wp_create_user($phone, $password, $phone.'@noemail.local'); if (is_wp_error($user_id)) return; $user = get_user_by('id', $user_id); } wp_set_auth_cookie($user->ID); wp_set_current_user($user->ID); do_action('wp_login', $user->user_login, $user); // Редирект после успешной авторизации wp_redirect(home_url('/dashboard')); exit; } }Как проверить, что авторизация работает
- Отправьте форму с номером телефона — проверьте получение SMS с кодом.
- Введите код в форму — после отправки должна произойти авторизация и редирект.
- Проверьте, что пользователь создан в разделе «Пользователи» WordPress с логином по номеру телефона.
- Попробуйте повторно использовать код — должен быть невалиден.
Частые ошибки и их исправление
- SMS не отправляются: проверьте правильность API ключа, номер телефона с международным кодом, лог запросов сервиса SMS.
- Код не сохраняется или не читается: убедитесь, что transient сохраняется и не удаляется раньше времени, проверяйте ключи и время жизни.
- Пользователь не создается: проверяйте возвращаемые ошибки wp_create_user, уникальность логина (номер телефона должен быть уникален).
- Не происходит авторизация после ввода кода: убедитесь, что вызываются wp_set_auth_cookie и wp_set_current_user, и что нет конфликтов с плагинами кэширования.
Практические советы по безопасности и производительности
- Ограничьте количество попыток ввода кода по IP и телефону, чтобы предотвратить перебор.
- Используйте SSL на сайте — обязательное условие для безопасности авторизации.
- Удаляйте or инвалидируйте OTP коды сразу после успешного входа.
- Логи отправки SMS не храните с номерами телефонов в открытом виде.
- Храните номера телефонов в едином формате, например, E.164.
Сравнение подходов к авторизации через SMS в WordPress
| Способ | Плюсы | Минусы | Пример реализации |
|---|---|---|---|
| Через WPForms + кастомный код | Гибкость, интеграция с уже используемыми формами | Требует разработки, знания API SMS | Код из статьи |
| Плагины авторизации по SMS (например, miniOrange) | Готовое решение, поддержка | Платные, ограниченная кастомизация | miniOrange OTP Verification |
| Использование сторонних сервисов (Firebase Auth) | Высокая надежность, масштабируемость | Сложность интеграции с WordPress и WPForms | Через REST API и JS SDK |