Двойная авторизация, или двухфакторная аутентификация (2FA), значительно повышает безопасность WordPress-сайта за счёт дополнительного слоя проверки пользователя. Обычно для реализации 2FA используются плагины, но иногда их применение нежелательно из-за нагрузки, совместимости или необходимости тонкой настройки. В этой статье мы разберём, как добавить двухфакторную авторизацию в WordPress без плагинов, используя собственный PHP-код и базовые возможности WordPress.
Почему стоит использовать двухфакторную аутентификацию в WordPress
Защита сайта — ключевая задача для любого владельца WordPress. Стандартная авторизация по паролю уязвима к взлому, особенно при использовании слабых паролей или утечке данных. Добавление второго фактора — например, одноразового кода из приложения Google Authenticator — позволяет значительно снизить риск взлома.
Двухфакторная аутентификация:
- Уменьшает вероятность несанкционированного доступа даже при компрометации пароля.
- Повышает доверие пользователей и клиентов.
- Не требует сложных инфраструктур — достаточно мобильного устройства с приложением для генерации кодов.
Как работает двухфакторная аутентификация для WordPress
В основе 2FA лежит генерация временных кодов (TOTP — Time-based One-Time Password), которые пользователь вводит после успешного ввода логина и пароля. Код генерируется на мобильном устройстве и действует короткое время (обычно 30 секунд).
Нашей задачей будет добавить проверку этого кода после стандартной авторизации WordPress. Для этого нужно:
- Сгенерировать секретный ключ для пользователя.
- Показать QR-код, который пользователь отсканирует в приложении (например, Google Authenticator, Authy).
- При логине запросить одноразовый код и сверить его с ожидаемым.
Реализация двухфакторной аутентификации в WordPress с помощью PHP
Установка библиотеки для TOTP
Для генерации и проверки TOTP кода удобно использовать библиотеку otphp. Установите её через Composer в корне сайта (если Composer не используется, можно скачать и подключить вручную):
composer require spomky-labs/otphpДалее подключим автозагрузчик Composer в файле functions.php вашей темы или в собственном плагине:
require_once ABSPATH . 'vendor/autoload.php';Создание и сохранение секрета для пользователя
Добавим функцию для генерации и сохранения секретного ключа в метаполя пользователя:
function wppremium_generate_2fa_secret($user_id) {
if (!class_exists('\OTPHP\TOTP')) {
return false;
}
$totp = new \OTPHP\TOTP();
$secret = $totp->getSecret();
update_user_meta($user_id, '_wppremium_2fa_secret', $secret);
return $secret;
}Эту функцию можно вызывать при активации 2FA для пользователя (например, через настройки профиля).
Вывод QR-кода для сканирования
Для удобства пользователя сформируем QR-код, который он сможет отсканировать приложением Google Authenticator. Используем Google Chart API для генерации картинки:
function wppremium_get_2fa_qr_code_url($user_id) {
$secret = get_user_meta($user_id, '_wppremium_2fa_secret', true);
if (!$secret) {
return false;
}
$user_info = get_userdata($user_id);
$issuer = urlencode(get_bloginfo('name'));
$label = urlencode($user_info->user_login);
$otp_uri = "otpauth://totp/{$issuer}:{$label}?secret={$secret}&issuer={$issuer}";
$qr_url = 'https://chart.googleapis.com/chart?chs=200x200&chld=M|0&cht=qr&chl=' . urlencode($otp_uri);
return $qr_url;
}Выведите img с этим URL в профиле пользователя для настройки 2FA.
Проверка одноразового кода при логине
Добавим проверку TOTP кода после успешной проверки пароля. Для этого используем хук wp_authenticate_user:
function wppremium_check_2fa_code($user, $password) {
if (is_wp_error($user)) {
return $user;
}
$user_id = $user->ID;
$secret = get_user_meta($user_id, '_wppremium_2fa_secret', true);
if (!$secret) {
// 2FA не активирована у пользователя
return $user;
}
// Получаем код из запроса (например, из POST)
if (empty($_POST['wppremium_2fa_code'])) {
return new WP_Error('2fa_required', __('Введите код двухфакторной аутентификации.', 'wppremium'));
}
$code = sanitize_text_field($_POST['wppremium_2fa_code']);
$totp = new \OTPHP\TOTP($secret);
if (!$totp->verify($code)) {
return new WP_Error('2fa_invalid', __('Неверный код двухфакторной аутентификации.', 'wppremium'));
}
return $user;
}
add_filter('wp_authenticate_user', 'wppremium_check_2fa_code', 10, 2);Обратите внимание, что необходимо добавить поле для ввода кода 2FA в форму входа.
Добавление поля ввода кода на страницу входа
Используем хук login_form для вывода дополнительного поля:
function wppremium_add_2fa_field() {
?><p>
<label for="wppremium_2fa_code"><?php _e('Код 2FA', 'wppremium'); ?><br />
<input type="text" name="wppremium_2fa_code" id="wppremium_2fa_code" class="input" value="" size="20" /></label>
</p><?php
}
add_action('login_form', 'wppremium_add_2fa_field');Дополнительные советы по безопасности и удобству
1. Реализуйте возможность отключения 2FA пользователем через профиль, с дополнительной защитой (например, подтверждение по email).
2. Добавьте резервные коды на случай потери доступа к приложению-генератору.
3. Логируйте попытки входа и ошибки 2FA для анализа безопасности.
4. При необходимости интегрируйте с плагинами для управления пользователями, например, Clearfy Pro для расширенного контроля доступа.
Заключение
Добавление двухфакторной аутентификации без плагинов в WordPress — вполне реализуемая задача, которая добавляет серьёзный уровень защиты без нагрузки на систему. Используя библиотеку OTPHP и стандартные хуки WordPress, можно создать гибкую и удобную систему 2FA, адаптированную под конкретные задачи.
Этот подход особенно полезен, если вы хотите контролировать весь процесс и не зависеть от сторонних решений. Однако не забывайте про регулярное тестирование и информирование пользователей о необходимости защиты аккаунтов.