Jak włączyć logowanie dwuskładnikowe (2FA) w WordPress bez wtyczek

Logowanie dwuskładnikowe (2FA, ang. Two-Factor Authentication) to jedna z najskuteczniejszych metod ochrony kont użytkowników WordPressa.
Wymaga podania nie tylko hasła, ale też drugiego składnika, np. kodu jednorazowego z aplikacji typu Google Authenticator lub Authy.

Większość stron używa do tego wtyczek, ale 2FA można wdrożyć ręcznie, bez dodatkowego oprogramowania — bezpośrednio w kodzie motywu lub wtyczki typu „mu-plugin”.

W tym poradniku pokażę, jak krok po kroku dodać prosty, bezpieczny system 2FA w WordPress, oparty na TOTP (Time-based One Time Password).


Dlaczego warto wdrożyć 2FA w WordPress

Hasła to najsłabszy punkt bezpieczeństwa każdej strony.
Atakujący może je:

  • przechwycić przez phishing,
  • złamać metodą brute-force,
  • lub odgadnąć przy użyciu wycieków danych.

2FA eliminuje ten problem, ponieważ nawet po poznaniu hasła atakujący nie zaloguje się bez jednorazowego kodu z urządzenia użytkownika.


Krok 1: Wymagania i przygotowanie

Będziemy korzystać z biblioteki PHP implementującej algorytm TOTP zgodny z Google Authenticator.
Najprościej dodać ją przez Composer:

composer require spomky-labs/otphp

Jeśli nie używasz Composera, możesz pobrać bibliotekę ręcznie z GitHub:
👉 https://github.com/Spomky-Labs/otphp


Krok 2: Generowanie sekretu TOTP

Każdy użytkownik WordPressa musi mieć przypisany swój indywidualny sekret (klucz), na podstawie którego generowane są kody 2FA.

Dodaj w swoim kodzie (np. w functions.php lub we własnej wtyczce):

use OTPHP\TOTP;

function generate_user_2fa_secret($user_id) {
    $totp = TOTP::create();
    update_user_meta($user_id, 'user_2fa_secret', $totp->getSecret());
    return $totp->getSecret();
}

Teraz możesz wywołać tę funkcję np. po rejestracji użytkownika, aby automatycznie przypisać mu klucz 2FA.


Krok 3: Wyświetlenie kodu QR do konfiguracji

Aby użytkownik mógł dodać konto do swojej aplikacji Google Authenticator, musi zeskanować kod QR.
Dodaj fragment do swojego panelu użytkownika:

use OTPHP\TOTP;

function display_2fa_qr_code($user_id) {
    $secret = get_user_meta($user_id, 'user_2fa_secret', true);
    if (!$secret) {
        $secret = generate_user_2fa_secret($user_id);
    }

    $totp = TOTP::create($secret);
    $totp->setLabel(get_bloginfo('name') . ':' . get_userdata($user_id)->user_login);

    $qr_url = $totp->getQrCodeUri();
    echo '<p>Zeskanuj ten kod w aplikacji Google Authenticator:</p>';
    echo '<img src="' . esc_url($qr_url) . '" alt="QR Code 2FA" />';
}

Po zeskanowaniu kodu aplikacja zacznie generować 6-cyfrowe kody co 30 sekund.


Krok 4: Weryfikacja kodu podczas logowania

Teraz musimy dodać drugi krok do logowania WordPressa — sprawdzenie kodu 2FA po podaniu hasła.

Dodaj filtr authenticate:

use OTPHP\TOTP;

add_filter('authenticate', 'verify_2fa_code_on_login', 30, 3);
function verify_2fa_code_on_login($user, $username, $password) {
    if (is_wp_error($user)) {
        return $user;
    }

    // Jeśli to administrator, wymagamy 2FA
    $secret = get_user_meta($user->ID, 'user_2fa_secret', true);
    if ($secret) {
        if (empty($_POST['2fa_code'])) {
            return new WP_Error('2fa_missing', 'Wprowadź kod z aplikacji Google Authenticator.');
        }

        $totp = TOTP::create($secret);
        if (!$totp->verify($_POST['2fa_code'])) {
            return new WP_Error('2fa_invalid', 'Nieprawidłowy kod 2FA.');
        }
    }

    return $user;
}

A następnie dodaj pole do formularza logowania:

add_action('login_form', function() {
    echo '<p><label for="2fa_code">Kod 2FA<br/><input type="text" name="2fa_code" id="2fa_code" class="input" value="" size="20" /></label></p>';
});

Krok 5: Wymuszenie 2FA dla wybranych ról

Jeśli chcesz, by 2FA było obowiązkowe np. tylko dla administratorów i redaktorów:

add_filter('authenticate', function($user) {
    if (!is_wp_error($user)) {
        $role = $user->roles[0];
        if (in_array($role, ['administrator', 'editor'])) {
            $secret = get_user_meta($user->ID, 'user_2fa_secret', true);
            if (!$secret) {
                return new WP_Error('2fa_required', 'Musisz skonfigurować 2FA przed zalogowaniem.');
            }
        }
    }
    return $user;
}, 20);

Krok 6: Odzyskiwanie dostępu

Na wypadek utraty telefonu możesz dodać opcję wygenerowania kodów zapasowych (np. w panelu użytkownika) i przechowywać je zaszyfrowane w meta danych.
Dobrą praktyką jest również umożliwienie resetu 2FA przez administratora (np. w wp-admin/profile.php).


Podsumowanie

Dzięki WP-CLI i prostym fragmentom kodu możesz wdrożyć dwuskładnikowe logowanie bez instalowania żadnych wtyczek.
To rozwiązanie:

  • działa szybciej,
  • nie obciąża bazy danych,
  • nie wymaga zaufania do zewnętrznych autorów wtyczek,
  • i można je w pełni dopasować do własnych potrzeb.

Jeśli chcesz chronić konta administratorów lub panel logowania przed brute-force, 2FA to obowiązkowy element każdej profesjonalnej instalacji WordPress.

KROK 1 Z 4

Z CZYM POTRZEBUJESZ POMOCY?