Как добавить двойную авторизацию в WordPress без плагинов

|

Двойная авторизация, или двухфакторная аутентификация (2FA), значительно повышает безопасность WordPress-сайта за счёт дополнительного слоя проверки пользователя. Обычно для реализации 2FA используются плагины, но иногда их применение нежелательно из-за нагрузки, совместимости или необходимости тонкой настройки. В этой статье мы разберём, как добавить двухфакторную авторизацию в WordPress без плагинов, используя собственный PHP-код и базовые возможности WordPress.

Почему стоит использовать двухфакторную аутентификацию в WordPress

Защита сайта — ключевая задача для любого владельца WordPress. Стандартная авторизация по паролю уязвима к взлому, особенно при использовании слабых паролей или утечке данных. Добавление второго фактора — например, одноразового кода из приложения Google Authenticator — позволяет значительно снизить риск взлома.

Двухфакторная аутентификация:

Как работает двухфакторная аутентификация для WordPress

В основе 2FA лежит генерация временных кодов (TOTP — Time-based One-Time Password), которые пользователь вводит после успешного ввода логина и пароля. Код генерируется на мобильном устройстве и действует короткое время (обычно 30 секунд).

Нашей задачей будет добавить проверку этого кода после стандартной авторизации WordPress. Для этого нужно:

  1. Сгенерировать секретный ключ для пользователя.
  2. Показать QR-код, который пользователь отсканирует в приложении (например, Google Authenticator, Authy).
  3. При логине запросить одноразовый код и сверить его с ожидаемым.

Реализация двухфакторной аутентификации в 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, адаптированную под конкретные задачи.

Этот подход особенно полезен, если вы хотите контролировать весь процесс и не зависеть от сторонних решений. Однако не забывайте про регулярное тестирование и информирование пользователей о необходимости защиты аккаунтов.

Как автоматически удалять пустые термины в WordPress: практическое руководство
12.04.2026
WooCommerce: автоматическое удаление неактивных корзин и заказов
15.05.2026
WooCommerce: как изменить цену товара в зависимости от роли пользователя
25.06.2026
Как автоматизировать создание резервных копий в WordPress с помощью плагинов и кода
12.12.2025
Как удалить или изменить URL записи WordPress без редиректа и ошибок 404
05.12.2025
×
-15%
на премиум плагин
My Popup

Повысьте конверсию!

Получить скидку »