2FA Auth Pilot
2FA Auth Pilot dokłada dodatkową warstwę zabezpieczeń do logowania w WordPressie, wymagając drugiego kroku weryfikacji po podaniu loginu i hasła. Wtyczka implementuje branżowy standard Time-based One-Time Password (TOTP) (RFC 6238) i współpracuje z dowolną zgodną aplikacją uwierzytelniającą, w tym z Google Authenticator, Microsoft Authenticator, Authy, 1Password i Duo.
Nawet jeśli hasło zostanie wykradzione, wyłudzone phishingiem albo wielokrotnie użyte gdzieś indziej, atakujący nie zaloguje się bez jednorazowego kodu wygenerowanego na urządzeniu użytkownika. Administratorzy mogą wymagać 2FA per rola, ustawić okres karencji, w którym użytkownicy mają się zarejestrować, oraz dodać zaufane zakresy IP zwolnione z drugiego składnika.

Wyróżniki
- Uwierzytelnianie TOTP zgodne z dowolną aplikacją RFC 6238 (Google Authenticator, Microsoft Authenticator, Authy, 1Password, Duo, FreeOTP, …).
- Awaryjny OTP e-mailem wysyłający 6-cyfrowy kod weryfikacyjny, gdy aplikacja uwierzytelniająca jest niedostępna.
- Kody zapasowe: od 5 do 20 jednorazowych kodów awaryjnych generowanych podczas rejestracji na wypadek utraty dostępu.
- Wymuszanie per rola: każdej roli WordPressa można przypisać status Wymagane, Opcjonalne albo Wyłączone.
- Okres karencji do 90 dni dla ról wymaganych, dzięki czemu istniejący użytkownicy nie zostają zablokowani w momencie włączenia 2FA.
- Whitelista IP w notacji IPv4 i CIDR pomijająca 2FA z zaufanych sieci (biuro, VPN, monitoring).
- Pamięć zaufanych urządzeń: opcja Zapamiętaj to urządzenie tłumi monity 2FA na konkretnej przeglądarce nawet do 365 dni.
- Ochrona API: XML-RPC oraz REST API WordPressa można zamknąć za sprawdzeniami świadomymi 2FA.
- Rejestracja przez kod QR z fallbackiem do ręcznego wpisania sekretu w środowiskach, gdzie kodu QR nie da się zeskanować.
- Konfigurowalne okno czasowe (1–4 interwały) kompensujące rozjazd zegara między serwerem a urządzeniem użytkownika.
- Czyste odinstalowanie — opcja usuwająca wszystkie dane wtyczki przy jej kasowaniu.
Wymagania
- WordPress 6.0 lub nowszy.
- PHP 7.4 lub nowszy (rekomendowane PHP 8.x).
- Dokładny zegar serwera. TOTP opiera się na synchronizacji czasu; rozjazd zegara powyżej 90 sekund spowoduje, że poprawne kody będą odrzucane.
- Aplikacja uwierzytelniająca zainstalowana na smartfonie, tablecie albo w menedżerze haseł każdego użytkownika.
- Do awaryjnego OTP e-mailowego — działająca konfiguracja wychodzącej poczty (wystarczy towarzysząca wtyczka Mail Pilot lub dowolna integracja SMTP).
Instalacja
- Pobierz archiwum ZIP wtyczki.
- W panelu WordPressa otwórz Wtyczki → Dodaj nową → Wyślij wtyczkę.
- Wybierz plik ZIP i kliknij Zainstaluj teraz.
- Kliknij Włącz wtyczkę.
- Otwórz Ustawienia → Uwierzytelnianie dwuskładnikowe, aby zacząć konfigurację.
Po aktywacji 2FA jest domyślnie globalnie wyłączone. Żaden użytkownik nie zostaje wciśnięty w nowy przepływ logowania, dopóki administrator nie włączy funkcji i nie przypisze wymagań do ról. Dzięki temu nikt nie zostanie przypadkiem odcięty przy pierwszym wdrożeniu.
Konfiguracja
Wszystkie ustawienia znajdują się pod Ustawienia → Uwierzytelnianie dwuskładnikowe i są podzielone na cztery zakładki: Ogólne, Role, Whitelista IP i Zaawansowane.
Ogólne
Zakładka Ogólne kontroluje zachowanie wyzwania 2FA po jego włączeniu.

| Ustawienie | Opis |
|---|---|
| Włącz 2FA | Główny przełącznik. Gdy wyłączony, wtyczka jest uśpiona i nie pokazuje wyzwania przy logowaniu. |
| Nazwa firmy / wystawcy | Etykieta widoczna przy wpisie w aplikacji uwierzytelniającej użytkownika. Podaj nazwę strony albo organizacji. |
| Okno kodu | Liczba 30-sekundowych interwałów akceptowanych wokół bieżącego czasu. Dopuszczalne wartości to 1–4. Szersze okno lepiej toleruje rozjazd zegarów, ale jest minimalnie mniej restrykcyjne. Domyślne 1 zwykle wystarcza. |
| Liczba kodów zapasowych | Ile jednorazowych kodów awaryjnych wystawić przy rejestracji (5–20). Domyślnie 10. |
| Pamięć urządzenia (dni) | Jak długo ważne jest ciasteczko Zapamiętaj to urządzenie (0–365). Wartość 0 całkowicie wyłącza pamięć zaufanych urządzeń. |
| Awaryjny OTP e-mailem | Po włączeniu na ekranie wyzwania pojawia się link Wyślij kod e-mailem. Kod trafia na adres e-mail konta użytkownika. |
| Okres karencji (dni) | Dla ról oznaczonych jako Wymagane — ile dni użytkownicy mają na ukończenie rejestracji od pierwszego logowania (0–90). W okresie karencji wyświetla się przypominający baner. |
Daj wystarczająco długą karencję użytkownikom, którzy nie logują się codziennie. Siedem do czternastu dni to wyważone ustawienie dla witryn zespołowych.
Role
Zakładka Role przypisuje jedną z trzech polityk do każdej roli WordPressa:

- Wymagane — 2FA musi być skonfigurowane. Po wygaśnięciu karencji użytkownik zostaje zmuszony do rejestracji przy kolejnym logowaniu i nie może odrzucić monitu.
- Opcjonalne — Użytkownicy mogą się zarejestrować ze swojego profilu, ale nigdy nie są do tego zmuszani.
- Wyłączone — Zakładka 2FA jest ukryta w profilu użytkownika, a logowanie pozostaje jednoskładnikowe.
Typowa twarda konfiguracja wygląda tak:
| Rola | Zalecana polityka |
|---|---|
| Administrator | Wymagane |
| Redaktor | Wymagane |
| Shop Manager / Autor | Wymagane lub Opcjonalne |
| Subskrybent / Klient | Opcjonalne |
Najpierw ustaw Administrator na Wymagane i przejdź własną rejestrację, zanim podniesiesz wymóg dla pozostałych ról. Podczas testów zawsze trzymaj otwartą drugą sesję administratora w innej przeglądarce.
Whitelista IP
Zakładka whitelisty IP przyjmuje jeden wpis na linię, jako pojedynczy adres albo w notacji CIDR:
203.0.113.42
198.51.100.0/24
10.0.0.0/8
2001:db8::/32
Logowania z whitelistowanego adresu pomijają wyzwanie 2FA, ale wciąż przechodzą normalną weryfikację loginu i hasła. Jest to przeznaczone dla zaufanych sieci biurowych, bastionów (jump host) i agentów monitorujących.
Whitelistuj wyłącznie źródła server-to-server. Nie dodawaj zakresów sieci domowych ani mobilnych; ich adresy się rotują i są dzielone między tysiące niepowiązanych użytkowników.
Zaawansowane

Zakładka Zaawansowane steruje integracją z powierzchnią żądań WordPressa oraz polityką retencji danych:
- Chroń XML-RPC — Po włączeniu żądania do
xmlrpc.phpsą odrzucane, chyba że zawierają poprawne hasło aplikacji powiązane z użytkownikiem, który ukończył rejestrację 2FA. Jeśli nie korzystasz z XML-RPC (większość nowoczesnych witryn nie korzysta), spokojnie zostaw ochronę włączoną. - Chroń REST API — Uwierzytelnione endpointy REST sprawdzają, czy wywołujący użytkownik spełnił wymóg 2FA. Endpointy anonimowe (np. publiczny feed wpisów) pozostają nietknięte. Aby pominąć ochronę dla jednorazowej sesji integracyjnej, wyczyść opcję
tfa_protect_rest_api. - Usuń wszystkie dane przy odinstalowaniu — Po włączeniu usunięcie wtyczki z Wtyczki → Zainstalowane wtyczki kasuje też każdą opcję, sekret użytkownika, kod zapasowy i wpis o urządzeniu. Zostaw wyłączone, jeśli planujesz tylko czasową dezaktywację.
Tłumaczenia

Zakładka Tłumaczenia odsłania każdy widoczny dla użytkownika tekst, jaki emituje wtyczka — monity wyzwania logowania, instrukcje rejestracji, komunikaty „zbyt wiele prób” i przepływ odzyskiwania dostępu — i pozwala nadpisać każdy z nich per aktywny język witryny. To zalecana droga do zmian tonu i brandowanych sformułowań; dołączone pliki .po nadal zapewniają bazowe tłumaczenie, gdy nie ustawisz nadpisania.
Użytkowanie
Dla administratorów
- Otwórz Ustawienia → Uwierzytelnianie dwuskładnikowe → Ogólne i włącz 2FA globalnie.
- Ustaw Nazwę firmy / wystawcy na nazwę swojej witryny, aby użytkownicy rozpoznali wpis w aplikacji uwierzytelniającej.
- Wybierz Okres karencji, który da istniejącym użytkownikom dość czasu na rejestrację — czternaście dni to bezpieczna wartość domyślna.
- Przejdź do zakładki Role i ustaw Administrator na Wymagane.
- Wyloguj się i ukończ własną rejestrację z profilu użytkownika. Zweryfikuj, że pokazuje się wyzwanie logowania i że kod zapasowy działa.
- Wróć do zakładki Role i stopniowo włączaj wymuszanie dla Redaktor, Shop Manager i innych uprzywilejowanych ról.
- Opcjonalnie dodaj zaufane sieci w zakładce Whitelista IP.
- Powiadom zespół o wdrożeniu na kilka dni przed końcem karencji.
Odblokowywanie zablokowanego użytkownika
Jeśli użytkownik zgubi telefon i wszystkie kody zapasowe:
- Otwórz Użytkownicy → Wszyscy użytkownicy i edytuj odpowiednie konto.
- Przewiń do sekcji Uwierzytelnianie dwuskładnikowe.
- Kliknij Resetuj 2FA. Sekret, kody zapasowe i zaufane urządzenia użytkownika zostają wyczyszczone.
- Przy kolejnym logowaniu użytkownik jest traktowany jak nowa rejestracja i ponownie przechodzi przez przepływ z kodem QR.
Reset 2FA dla innego użytkownika może wykonać tylko administrator. Akcja jest zapisywana w dzienniku aktywności WordPressa, jeśli zainstalowano wtyczkę audytową.
Dla użytkowników końcowych (rejestracja, logowanie, odzyskiwanie)
Pierwsza rejestracja
- Zaloguj się do WordPressa loginem i hasłem.
- Otwórz Użytkownicy → Profil (lub Witaj → Edytuj profil).
- Przewiń do karty Uwierzytelnianie dwuskładnikowe i kliknij Włącz uwierzytelnianie dwuskładnikowe.
- Zainstaluj aplikację uwierzytelniającą na telefonie, jeśli jeszcze jej nie masz. Polecane aplikacje:
- Google Authenticator (iOS, Android)
- Microsoft Authenticator (iOS, Android)
- Authy (iOS, Android, desktop)
- 1Password lub Bitwarden (wbudowane w menedżer haseł)
- Otwórz aplikację i wybierz Dodaj konto → Zeskanuj kod QR.
- Zeskanuj kod QR wyświetlony na stronie profilu w WordPressie. Jeśli skanowanie nie zadziała, dotknij Wpisz klucz konfiguracyjny i wpisz sekret pokazany pod kodem QR.
- Aplikacja zacznie generować nowy 6-cyfrowy kod co 30 sekund. Wpisz bieżący kod w pole Zweryfikuj kod i kliknij Aktywuj.
- WordPress wyświetli Twoje kody zapasowe. Pobierz je albo wydrukuj i schowaj w bezpiecznym miejscu — najlepiej w sejfie menedżera haseł albo w zapieczętowanej kopercie. Każdy kod działa raz.
- Potwierdź, że zapisałeś kody zapasowe. Rejestracja jest zakończona.
Codzienne logowanie
- Wpisz login i hasło jak zwykle.
- Na kolejnym ekranie otwórz aplikację uwierzytelniającą i odczytaj bieżący 6-cyfrowy kod.
- Wpisz kod w pole wyzwania i kliknij Zweryfikuj.
- Opcjonalnie: zaznacz Zapamiętaj to urządzenie na 30 dni (limit zależy od ustawienia Pamięć urządzenia przez administratora). Rób to tylko na urządzeniach, które kontrolujesz.
- Jesteś zalogowany.
Jeśli źle wpiszesz kod, spróbuj jeszcze raz — aplikacja pokazuje nowy kod co 30 sekund. Powtarzające się niepowodzenia ostatecznie uruchomią standardową ochronę WordPressa przed atakami logowania.
Użycie kodu zapasowego
Kiedy nie masz przy sobie telefonu:
- Na ekranie wyzwania 2FA kliknij Użyj kodu zapasowego.
- Wpisz jeden z kodów zapisanych przy rejestracji. Myślniki są opcjonalne.
- Po zalogowaniu otwórz profil i kliknij Wygeneruj kody zapasowe ponownie. Kody zapasowe są jednorazowe; ten, którego właśnie użyłeś, jest już nieważny.
Awaryjny OTP e-mailem
Jeśli administrator włączył awaryjny OTP e-mailem, na ekranie wyzwania zobaczysz też Wyślij kod e-mailem. Kliknięcie wysyła jednorazowy kod na adres e-mail Twojego konta, ważny przez dziesięć minut. Jest to opcja awaryjna — dziedziczy bezpieczeństwo Twojej skrzynki, więc jest słabsza niż kod TOTP.
Wyłączanie 2FA na własnym koncie
Jeśli Twoja rola to Opcjonalne, otwórz Użytkownicy → Profil, przewiń do Uwierzytelnianie dwuskładnikowe i kliknij Wyłącz. Jeśli Twoja rola to Wymagane, przycisk jest ukryty i tylko administrator może usunąć Twoją rejestrację.
FAQ
Jakie aplikacje uwierzytelniające są wspierane? Każda aplikacja implementująca RFC 6238 TOTP z domyślnym okresem 30 sekund i 6-cyfrowymi kodami. Należą do nich Google Authenticator, Microsoft Authenticator, Authy, 1Password, Bitwarden, Duo, FreeOTP oraz większość tokenów sprzętowych obsługujących TOTP.
Czy użytkownicy mogą przenieść sekret na nowy telefon? Tak. Aplikacje takie jak Authy czy 1Password automatycznie synchronizują sekret między urządzeniami. W przypadku Google Authenticator użytkownik może wyeksportować konta ze starego telefonu lub — jeśli to już niemożliwe — administrator może zresetować sekret i ponownie zarejestrować użytkownika.
Co się dzieje w okresie karencji? Użytkownicy w roli wymaganej widzą przypominający baner na każdej stronie panelu administracyjnego oraz przycisk Ustaw 2FA w profilu. Gdy karencja się kończy, kolejne logowanie wymusza rejestrację, zanim użytkownik dotrze do kokpitu.
Czy kody zapasowe są wielokrotnego użytku? Nie. Każdy kod zapasowy jest jednorazowy. Gdy tylko zostanie użyty, traci ważność. Użytkownicy mogą w dowolnym momencie wygenerować nowy komplet ze swojego profilu; regeneracja unieważnia poprzedni zestaw.
Czy mogę wyłączyć 2FA czasowo podczas migracji? Tak. Otwórz Ustawienia → Uwierzytelnianie dwuskładnikowe → Ogólne i wyłącz główny przełącznik. Sekrety użytkowników i kody zapasowe pozostają w bazie danych, więc ponowne włączenie funkcji przywraca każdą istniejącą rejestrację bez zmuszania użytkowników do ponownego setupu.
Czy wtyczka działa z WP-CLI? WP-CLI omija przepływ logowania webowego i nie podlega 2FA. Dostęp do WP-CLI ogranicz na poziomie systemu operacyjnego (klucz SSH, sudoers, bastion).
Czy XML-RPC naprawdę jest jeszcze w użyciu? Większość nowoczesnych integracji przeszła na REST API lub hasła aplikacji. Jeśli nie potrzebujesz XML-RPC, zostaw ochronę włączoną albo zablokuj endpoint na poziomie serwera HTTP.
Czy 2FA Auth Pilot działa obok innych wtyczek 2FA? Nie. Uruchomienie dwóch wtyczek 2FA jednocześnie prowadzi do podwójnych monitów i niespójnego stanu. Wyłącz inną wtyczkę 2FA przed aktywacją 2FA Auth Pilot.
Czy wspiera sprzętowe klucze bezpieczeństwa (WebAuthn / FIDO2)? Bieżąca wersja skupia się na TOTP i OTP e-mailowym. Wsparcie kluczy sprzętowych jest zaplanowane w roadmapie.
Gdzie przechowywane są sekrety? Sekret TOTP każdego użytkownika i hashe kodów zapasowych są zapisane w tabeli user-meta WordPressa, w tej samej bazie co reszta witryny. Kody zapasowe są zahashowane; tekst jawny jest pokazywany tylko raz, w momencie generowania.
Rozwiązywanie problemów
„Nieprawidłowy kod” mimo że aplikacja pokazuje właściwą liczbę.
Najczęstszą przyczyną jest rozjazd zegara. Kody TOTP są powiązane z bieżącym czasem w rozdzielczości 30 sekund. Sprawdź, czy zegar serwera jest zsynchronizowany (NTP / chrony) i czy zegar telefonu jest ustawiony na Automatyczny. Tymczasowo możesz zwiększyć Okno kodu w ustawieniach Ogólne na 2 lub 3.
Użytkownik zgubił telefon i wszystkie kody zapasowe. Administrator może zresetować 2FA użytkownika w Użytkownicy → Wszyscy użytkownicy → Edytuj użytkownika → Resetuj 2FA. Użytkownik przejdzie ponownie przez przepływ z kodem QR przy następnym logowaniu. Jeśli zablokowany użytkownik jest jedynym administratorem, zobacz kolejny punkt.
Jedyny administrator jest zablokowany. Połącz się z bazą danych (phpMyAdmin lub WP-CLI) i usuń odpowiednie wiersze z user-meta:
DELETE FROM wp_usermeta
WHERE user_id = <admin-id>
AND meta_key LIKE 'tfa\_auth\_pilot%';Administrator zaloguje się wtedy normalnie i będzie mógł zarejestrować się ponownie.
Kod QR się nie wyświetla. Sprawdź, czy PHP ma włączone rozszerzenie GD. Jeśli GD nie ma, wtyczka przechodzi w tryb tekstowy z kluczem konfiguracyjnym — użytkownik może wpisać sekret ręcznie do aplikacji uwierzytelniającej.
Wiadomości z OTP e-mailowym nie dochodzą. Wyślij testowy e-mail z wtyczki do poczty transakcyjnej (np. Mail Pilot → Test email). Jeśli test zawodzi, najpierw popraw konfigurację wychodzącej poczty. Kody są też zapisywane w dzienniku aktywności WordPressa, jeśli zainstalowano wtyczkę audytową.
Integracja z REST API nagle zwraca 401. Włączenie Chroń REST API wymaga, by wywołania uwierzytelnione pochodziły od użytkownika, który ukończył 2FA. Przełącz integrację na hasła aplikacji wystawione przez użytkownika, którego rola spełnia wymóg 2FA.
Logowanie jest wolne po włączeniu 2FA. Niewielkie opóźnienie (poniżej sekundy) jest oczekiwane — wynika z renderowania wyzwania i obsługi OTP e-mailowego. Większe opóźnienia zwykle wskazują na timeouty serwera pocztowego. Wyłącz tymczasowo awaryjny OTP e-mailem, aby to potwierdzić.
Ciasteczka zaufanych urządzeń znikają od razu. Urządzenia są śledzone podpisanym ciasteczkiem powiązanym z przeglądarką. Okna prywatne/incognito, agresywne sprzątacze ciasteczek i blokery treści mogą je usuwać. W takich środowiskach lepiej ograniczyć poleganie na Zapamiętaj to urządzenie.
W razie spraw nieopisanych powyżej skontaktuj się ze wsparciem, podając: wersję WordPressa, wersję PHP, aktywne wtyczki, dokładny komunikat błędu i krótki opis kroków, które do niego prowadzą.