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.