Skip to Content

2FA Auth Pilot

2FA Auth Pilot voegt een extra beveiligingslaag toe aan je WordPress-login door een tweede verificatiestap te vragen na gebruikersnaam en wachtwoord. De plugin implementeert het industriestandaard Time-based One-Time Password (TOTP) algoritme (RFC 6238) en werkt met elke compatibele authenticator-app, waaronder Google Authenticator, Microsoft Authenticator, Authy, 1Password en Duo.

Zelfs wanneer een wachtwoord wordt gestolen, gephisht of hergebruikt, kunnen aanvallers geen login voltooien zonder de eenmalige code die op het apparaat van de gebruiker wordt gegenereerd. Beheerders kunnen 2FA per rol verplicht stellen, een grace period instellen waarbinnen gebruikers zich moeten enrollen, en trusted IP-ranges whitelisten die vrijgesteld zijn van de tweede factor.

2FA login-challenge
2FA login-challenge

Voordelen

  • TOTP-authenticatie compatibel met elke RFC 6238 authenticator-app (Google Authenticator, Microsoft Authenticator, Authy, 1Password, Duo, FreeOTP, …).
  • Email OTP-fallback die een 6-cijferige verificatiecode per e-mail stuurt wanneer de authenticator-app niet beschikbaar is.
  • Recovery codes: 5 tot 20 single-use backup codes die tijdens enrollment worden gegenereerd voor noodtoegang.
  • Enforcement per rol: elke WordPress-rol kan worden ingesteld op Verplicht, Optioneel of Uitgeschakeld.
  • Grace period tot 90 dagen voor verplichte rollen, zodat bestaande gebruikers niet buitengesloten raken op het moment dat 2FA wordt geactiveerd.
  • IP-whitelisting met IPv4- en CIDR-notatie om 2FA over te slaan vanaf trusted netwerken (kantoor, VPN, monitoring).
  • Trusted-device memory: de optie Onthoud dit apparaat kan 2FA-prompts tot 365 dagen onderdrukken op een specifieke browser.
  • API-bescherming: XML-RPC en de WordPress REST API kunnen achter 2FA-bewuste checks worden gezet.
  • QR-code enrollment met een manuele secret-fallback voor omgevingen waar de QR-code niet gescand kan worden.
  • Configureerbaar tijdsvenster (1–4 intervallen) om clock drift tussen de server en het apparaat van de gebruiker te compenseren.
  • Clean uninstall-optie die alle plugin-data verwijdert wanneer de plugin verwijderd wordt.

Vereisten

  • WordPress 6.0 of nieuwer.
  • PHP 7.4 of nieuwer (PHP 8.x aanbevolen).
  • Een accurate serverklok. TOTP leunt op tijdsynchronisatie; een clock drift van meer dan 90 seconden zorgt ervoor dat geldige codes worden afgewezen.
  • Een authenticator-app geïnstalleerd op de smartphone, tablet of password manager van elke gebruiker.
  • Voor de email OTP-fallback, een werkende outgoing-mail-setup (de companion-plugin Mail Pilot of een willekeurige SMTP-integratie volstaat).

Installatie

  1. Download het ZIP-archief van de plugin.
  2. Open in de WordPress-admin Plugins → Nieuwe plugin → Plugin uploaden.
  3. Selecteer het ZIP-bestand en klik op Nu installeren.
  4. Klik op Plugin activeren.
  5. Open Instellingen → Two-Factor Authentication om de configuratie te starten.

Na activatie is 2FA globaal standaard uitgeschakeld. Geen enkele gebruiker wordt in de nieuwe login-flow geduwd totdat de beheerder de feature inschakelt en rol-vereisten toewijst. Zo voorkom je dat iemand per ongeluk buitengesloten raakt tijdens de initiële rollout.

Configuratie

Alle instellingen staan onder Instellingen → Two-Factor Authentication en zijn verdeeld over vier tabs: General, Roles, IP Whitelist en Advanced.

General

De General-tab regelt hoe de 2FA-challenge zich gedraagt zodra deze actief is.

General settings
General settings
InstellingBeschrijving
Enable 2FAHoofdschakelaar. Wanneer uit, ligt de plugin stil en wordt er geen login-challenge getoond.
Company / issuer nameHet label dat naast de entry in de authenticator-app van de gebruiker verschijnt. Gebruik de naam van de website of organisatie.
Code windowAantal intervallen van 30 seconden dat rond de huidige tijd geaccepteerd wordt. Waarden 1–4 zijn toegestaan. Een breder venster is toleranter voor clock drift maar iets minder strikt. De default 1 is meestal prima.
Recovery code countHoeveel single-use backup codes worden uitgegeven bij enrollment (5–20). De default is 10.
Device memory (days)Hoelang het Onthoud dit apparaat-cookie geldig is (0–365). Zet op 0 om trusted-device memory volledig uit te schakelen.
Email OTP fallbackIndien ingeschakeld verschijnt op het challenge-scherm een link Stuur code per e-mail. De code wordt afgeleverd op het account-e-mailadres van de gebruiker.
Grace period (days)Voor rollen gemarkeerd als Verplicht: hoeveel dagen gebruikers hebben om enrollment af te ronden na hun eerste login (0–90). Tijdens de grace period wordt een reminder-banner getoond.

Houd de grace period lang genoeg voor gebruikers die niet elke dag inloggen. Zeven tot veertien dagen is een gebalanceerde default voor zakelijke sites.

Roles

De Roles-tab wijst aan elke WordPress-rol één van drie policies toe:

Enforcement per rol
Enforcement per rol
  • Required — 2FA moet geconfigureerd zijn. Na het verstrijken van de grace period wordt de gebruiker bij de volgende login gedwongen tot enrollment en kan de prompt niet worden weggeklikt.
  • Optional — Gebruikers kunnen zich vanuit hun profiel enrollen maar worden er nooit toe gedwongen.
  • Disabled — De 2FA-tab wordt verborgen op het gebruikersprofiel en de login-flow blijft single-factor.

Een typische geharde configuratie ziet er zo uit:

RolAanbevolen policy
AdministratorRequired
EditorRequired
Shop manager / AuthorRequired of Optional
Subscriber / CustomerOptional

Zet Administrator eerst op Required en rond je eigen enrollment af voordat je de vereiste verhoogt voor andere rollen. Houd tijdens het testen altijd minstens één administrator-sessie open in een tweede browser.

IP whitelist

De IP whitelist-tab accepteert één entry per regel, in single-address of CIDR-vorm:

203.0.113.42 198.51.100.0/24 10.0.0.0/8 2001:db8::/32
IP whitelist
IP whitelist

Logins vanaf een gewhitelist adres slaan de 2FA-challenge over, maar gaan nog steeds door de normale gebruikersnaam- en wachtwoordcheck. Dit is bedoeld voor trusted kantoor-netwerken, jump hosts of monitoring-agents.

Whitelist alleen server-naar-server-bronnen. Whitelist geen residentiële of mobiele-netwerk ranges; hun adressen rouleren en worden gedeeld door duizenden niet-gerelateerde gebruikers.

Advanced

Two-Factor Auth — Advanced tab
Advanced-tab — XML-RPC- en REST API-gates, plus de destructieve Delete-on-uninstall toggle.

De Advanced-tab regelt de integratie met het request-oppervlak van WordPress en data-retentie:

  • Protect XML-RPC — Indien ingeschakeld worden requests naar xmlrpc.php geweigerd tenzij ze een geldig application password bevatten van een gebruiker die zijn 2FA-enrollment heeft afgerond. Als je geen XML-RPC gebruikt (de meeste moderne sites niet) kun je de bescherming aan laten.
  • Protect REST API — Geauthenticeerde REST endpoints controleren of de aanroepende gebruiker aan 2FA voldoet. Anonieme endpoints (zoals de publieke posts-feed) blijven onaangeroerd. Omzeil deze voor één capture-sessie door de option tfa_protect_rest_api te wissen.
  • Delete all data on uninstall — Indien ingeschakeld worden bij het verwijderen van de plugin via Plugins → Geïnstalleerde plugins ook alle opties, user secrets, recovery codes en device records gewist. Laat dit uit als je van plan bent de plugin tijdelijk te deactiveren.

Translations

Two-Factor Auth — Translations tab
Translations-tab — overschrijf elke 2FA-string die zichtbaar is voor de bezoeker, per taal (Engels / Italiaans / Frans / Duits / Spaans / …) zonder .po-bestanden aan te raken.

De Translations-tab toont elke string die de plugin naar de bezoeker stuurt — de login-challenge prompts, de enrollment-instructies, de “te veel pogingen”-meldingen en de recovery-flow — en laat je elke string per actieve site-taal overschrijven. Dit is de aanbevolen route voor toonaanpassingen en brand-specifieke bewoording; de meegeleverde .po-bestanden blijven de baseline-vertaling leveren wanneer er geen override is ingesteld.

Gebruik

Voor beheerders

  1. Open Instellingen → Two-Factor Authentication → General en schakel 2FA globaal in.
  2. Stel de Company / issuer name in op je sitenaam, zodat gebruikers de entry in hun authenticator-app herkennen.
  3. Kies een Grace period die bestaande gebruikers genoeg tijd geeft om zich te enrollen — veertien dagen is een veilige default.
  4. Schakel naar de Roles-tab en zet Administrator op Required.
  5. Log uit en rond je eigen enrollment af vanuit het gebruikersprofiel. Verifieer dat de login-challenge verschijnt en dat een recovery code werkt.
  6. Ga terug naar de Roles-tab en activeer enforcement geleidelijk voor Editor, Shop Manager en elke andere bevoorrechte rol.
  7. Voeg eventueel trusted netwerken toe aan de IP Whitelist-tab.
  8. Communiceer de rollout naar het team een paar dagen voordat de grace period afloopt.

Een buitengesloten gebruiker resetten

Als een gebruiker zijn telefoon en alle recovery codes kwijt is:

  1. Open Gebruikers → Alle gebruikers en bewerk het betreffende account.
  2. Scroll naar de sectie Two-Factor Authentication.
  3. Klik op Reset 2FA. De secret van de gebruiker, recovery codes en trusted devices worden gewist.
  4. Bij de volgende login wordt de gebruiker behandeld als een nieuwe enrollment en gaat opnieuw door de QR-code flow.

Alleen beheerders kunnen 2FA voor een andere gebruiker resetten. De actie wordt geregistreerd in het WordPress activity log wanneer een audit-plugin is geïnstalleerd.

Voor eindgebruikers (enrollment, login, recovery)

Eerste enrollment

  1. Log in op WordPress met gebruikersnaam en wachtwoord.
  2. Open Gebruikers → Profiel (of Hi → Profiel bewerken).
  3. Scroll naar de kaart Two-Factor Authentication en klik op Two-factor authentication inschakelen.
  4. Installeer een authenticator-app op je telefoon als je er nog geen hebt. Aanbevolen apps:
    • Google Authenticator (iOS, Android)
    • Microsoft Authenticator (iOS, Android)
    • Authy (iOS, Android, desktop)
    • 1Password of Bitwarden (ingebouwd in de password manager)
  5. Open de app en kies Account toevoegen → QR-code scannen.
  6. Scan de QR-code die op de WordPress-profielpagina wordt getoond. Lukt scannen niet, tik dan op Voer setup key in en typ de secret die onder de QR-code staat.
  7. De app begint elke 30 seconden een nieuwe 6-cijferige code te produceren. Typ de huidige code in het veld Verify code en klik op Activate.
  8. WordPress toont je recovery codes. Download of print ze en bewaar ze ergens veilig — een password manager vault of een verzegelde envelop. Elke code werkt eenmalig.
  9. Bevestig dat je de recovery codes hebt opgeslagen. Enrollment is afgerond.

Dagelijkse login

  1. Voer je gebruikersnaam en wachtwoord in zoals gewoonlijk.
  2. Open op het volgende scherm je authenticator-app en lees de huidige 6-cijferige code.
  3. Typ de code in het challenge-veld en klik op Verify.
  4. Optioneel: vink Onthoud dit apparaat voor 30 dagen aan (de limiet hangt af van de Device memory-instelling van de beheerder). Doe dit alleen op apparaten die je zelf beheert.
  5. Je bent ingelogd.

Als je de code verkeerd typt, typ hem dan opnieuw — de app toont elke 30 seconden een nieuwe code. Bij herhaalde fouten worden uiteindelijk de standaard WordPress login-lockout protections geactiveerd.

Een recovery code gebruiken

Wanneer je je telefoon niet bij je hebt:

  1. Klik op het 2FA-challenge-scherm op Gebruik een recovery code.
  2. Typ één van de codes die je bij enrollment hebt opgeslagen. Streepjes zijn optioneel.
  3. Open na het inloggen je profiel en klik op Recovery codes opnieuw genereren. Recovery codes zijn single-use; de code die je net hebt gebruikt is nu ongeldig.

Email OTP-fallback

Als de beheerder de email OTP-fallback heeft ingeschakeld, zie je op het challenge-scherm ook Stuur code per e-mail. Klik je daarop, dan wordt een eenmalige code afgeleverd op je account-e-mailadres die tien minuten geldig is. Dit is bedoeld als nood-optie — het erft de beveiliging van je inbox en is dus niet zo sterk als een TOTP-code.

2FA op je eigen account uitschakelen

Als je rol Optional is, open je Gebruikers → Profiel, scroll naar Two-Factor Authentication en klik op Disable. Is je rol Required, dan is deze knop verborgen en kan alleen een beheerder je enrollment wissen.

FAQ

Welke authenticator-apps worden ondersteund? Elke app die RFC 6238 TOTP implementeert met de standaard 30-seconden-periode en 6-cijferige codes. Dat omvat Google Authenticator, Microsoft Authenticator, Authy, 1Password, Bitwarden, Duo, FreeOTP en de meeste hardware tokens met TOTP-ondersteuning.

Kunnen gebruikers hun secret naar een nieuwe telefoon verhuizen? Ja. Apps zoals Authy en 1Password synchroniseren de secret automatisch over apparaten. Met Google Authenticator kan de gebruiker accounts vanaf de oude telefoon exporteren of, als dat niet meer mogelijk is, kan een beheerder de secret resetten en de gebruiker opnieuw enrollen.

Wat gebeurt er tijdens de grace period? Verplichte gebruikers zien op elke admin-pagina een reminder-banner en een knop Set up 2FA op hun profiel. Wanneer de grace period afloopt, dwingt de volgende login enrollment af voordat de gebruiker de dashboard bereikt.

Zijn recovery codes herbruikbaar? Nee. Elke recovery code is single-use. Zodra er één wordt gebruikt, wordt deze ongeldig. Gebruikers kunnen vanuit hun profiel op elk moment de volledige set opnieuw genereren; opnieuw genereren maakt de oude set ongeldig.

Kan ik 2FA tijdelijk uitschakelen tijdens een migratie? Ja. Open Instellingen → Two-Factor Authentication → General en zet de hoofdschakelaar uit. User secrets en recovery codes blijven in de database staan, dus bij het opnieuw inschakelen van de feature wordt elke bestaande enrollment hersteld zonder dat gebruikers zich opnieuw hoeven te enrollen.

Werkt de plugin met WP-CLI? WP-CLI omzeilt de web-login flow en valt niet onder 2FA. Beperk WP-CLI-toegang op operating-system-niveau (SSH key, sudoers, jump host).

Wordt XML-RPC echt nog gebruikt? De meeste moderne integraties zijn overgestapt op de REST API of application passwords. Heb je XML-RPC niet nodig, laat de bescherming dan ingeschakeld of disable het endpoint op web-server-niveau.

Werkt 2FA Auth Pilot naast andere 2FA-plugins? Nee. Twee 2FA-plugins tegelijk draaien leidt tot dubbele prompts en inconsistente state. Deactiveer elke andere 2FA-plugin voordat je 2FA Auth Pilot activeert.

Ondersteunt het hardware security keys (WebAuthn / FIDO2)? De huidige versie focust op TOTP en email OTP. Ondersteuning voor hardware keys staat op de roadmap.

Waar worden de secrets opgeslagen? De TOTP-secret en hashes van de recovery codes per gebruiker worden opgeslagen in de WordPress user-meta tabel op dezelfde database als de rest van de site. Recovery codes worden gehasht; de plaintext wordt alleen eenmalig getoond op het moment van generatie.

Troubleshooting

“Ongeldige code” terwijl de app het juiste getal toont. De meest voorkomende oorzaak is clock drift. TOTP-codes zijn gekoppeld aan de huidige tijd met een resolutie van 30 seconden. Controleer of de serverklok gesynchroniseerd is (NTP / chrony) en of de klok van de telefoon op Automatisch staat. Als tijdelijke workaround verhoog je Code window in de General settings naar 2 of 3.

Een gebruiker is zijn telefoon en alle recovery codes kwijt. Een beheerder kan de 2FA van de gebruiker resetten via Gebruikers → Alle gebruikers → Gebruiker bewerken → Reset 2FA. De gebruiker doorloopt de QR-code flow opnieuw bij de volgende login. Is de buitengesloten gebruiker de enige administrator, zie dan het volgende item.

De enige administrator is buitengesloten. Maak verbinding met de database (phpMyAdmin of WP-CLI) en verwijder de relevante user-meta rijen:

DELETE FROM wp_usermeta WHERE user_id = <admin-id> AND meta_key LIKE 'tfa\_auth\_pilot%';

De administrator kan vervolgens normaal inloggen en zich opnieuw enrollen.

De QR-code wordt niet getoond. Controleer of PHP de GD-extensie heeft ingeschakeld. Ontbreekt GD, dan valt de plugin terug op een text-mode setup key — de gebruiker kan de secret handmatig in de authenticator-app intypen.

Email OTP-berichten komen niet aan. Stuur een testmail vanuit je transactional-mail plugin (bijvoorbeeld Mail Pilot → Test e-mail). Mislukt die test, repareer dan eerst de outgoing-mail-configuratie. Codes worden ook in het WordPress activity log geschreven wanneer een audit-plugin geïnstalleerd is.

REST API-integratie geeft opeens 401 terug. Protect REST API inschakelen vereist dat geauthenticeerde calls komen van een gebruiker met afgeronde 2FA. Schakel de integratie over op application passwords, uitgegeven door een gebruiker wiens rol aan 2FA voldoet.

Login is traag na het inschakelen van 2FA. Een kleine vertraging (onder één seconde) is te verwachten vanwege de email-OTP en het renderen van de challenge. Grotere vertragingen wijzen meestal op een onderliggende mail-server timeout. Schakel de email OTP-fallback tijdelijk uit om dat te bevestigen.

Trusted-device cookies verdwijnen meteen. Apparaten worden bijgehouden via een signed cookie gekoppeld aan de browser. Private/incognito-vensters, agressieve cookie cleaners en content blockers kunnen hem strippen. Verminder in die omgevingen de afhankelijkheid van Onthoud dit apparaat.

Voor alles wat hier niet behandeld wordt, neem contact op met support en stuur: WordPress-versie, PHP-versie, actieve plugins, de exacte foutmelding en een korte beschrijving van de stappen die erheen leiden.

Last updated on