Files
dbois/ADMIN_2FA_MANUAL.md

742 lines
21 KiB
Markdown

# DBOIS Tweefactorauthenticatie - Beheerdershandleiding
## Inhoudsopgave
1. [Introductie](#introductie)
2. [Installatie en Configuratie](#installatie-en-configuratie)
3. [Gebruikers Helpen met 2FA Setup](#gebruikers-helpen-met-2fa-setup)
4. [Veelvoorkomende Problemen Oplossen](#veelvoorkomende-problemen-oplossen)
5. [Gebruikers Deblokkeren](#gebruikers-deblokkeren)
6. [Best Practices](#best-practices)
7. [Veelgestelde Vragen](#veelgestelde-vragen)
---
## Introductie
### Wat is Tweefactorauthenticatie?
Tweefactorauthenticatie (2FA) is een extra beveiligingslaag die vereist dat gebruikers twee vormen van identificatie opgeven bij het inloggen:
1. **Iets dat ze weten**: hun wachtwoord
2. **Iets dat ze hebben**: hun telefoon of e-mailaccount
### Waarom 2FA Gebruiken?
- **Bescherming tegen gestolen wachtwoorden**: Zelfs als iemands wachtwoord wordt gestolen, kan een aanvaller niet inloggen zonder toegang tot de tweede factor
- **Compliance**: Voldoet aan beveiligingsrichtlijnen en compliance-vereisten
- **Vertrouwen**: Gebruikers weten dat hun accounts beter beschermd zijn
### Beschikbare 2FA Methodes
DBOIS ondersteunt twee 2FA-methodes:
1. **E-mail OTP (One-Time Password)**
- Gebruiker ontvangt een 6-cijferige code per e-mail
- Code is 10 minuten geldig
- Eenvoudig te gebruiken, geen extra app nodig
- Geschikt voor gebruikers die niet technisch onderlegd zijn
2. **Google Authenticator**
- Gebruiker installeert een authenticator app op hun smartphone
- App genereert elke 30 seconden een nieuwe 6-cijferige code
- Werkt zonder internetverbinding
- Veiliger dan e-mail (geen afhankelijkheid van e-mailbeveiliging)
- Apps: Google Authenticator, Microsoft Authenticator, Authy, etc.
---
## Installatie en Configuratie
### Stap 1: Database Migratie Uitvoeren
**BELANGRIJK**: Voer eerst een backup uit van uw database voordat u de migratie uitvoert!
#### Optie A: Via Command Line
```bash
# Navigeer naar de DBOIS directory
cd /pad/naar/dbois
# Voer de migratie uit
mysql -u [gebruikersnaam] -p [database_naam] < application/migrations/001_add_two_factor_authentication.sql
```
Vervang:
- `[gebruikersnaam]` met uw MySQL gebruikersnaam
- `[database_naam]` met de naam van uw DBOIS database
#### Optie B: Via phpMyAdmin
1. Log in op phpMyAdmin
2. Selecteer de DBOIS database
3. Klik op de "SQL" tab
4. Open het bestand `application/migrations/001_add_two_factor_authentication.sql` in een teksteditor
5. Kopieer de gehele inhoud
6. Plak in het SQL venster van phpMyAdmin
7. Klik op "Go" of "Uitvoeren"
#### Verificatie
Controleer of de migratie succesvol was:
```sql
-- Controleer nieuwe kolommen in users tabel
DESCRIBE users;
-- U zou deze kolommen moeten zien:
-- two_factor_enabled
-- two_factor_method
-- two_factor_secret
-- Controleer nieuwe tabel
SHOW TABLES LIKE 'user_otp_codes';
```
### Stap 2: E-mail Configuratie Controleren
Zorg ervoor dat de e-mailconfiguratie correct is ingesteld in `application/config/email.php`:
```php
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'mail.uwdomain.nl';
$config['smtp_user'] = 'noreply@dbois.nl';
$config['smtp_pass'] = 'uw_wachtwoord';
$config['smtp_port'] = 587;
$config['smtp_crypto'] = 'tls';
$config['mailtype'] = 'html';
$config['charset'] = 'utf-8';
$config['newline'] = "\r\n";
```
**Test de e-mailconfiguratie** door de wachtwoord-vergeten functie te gebruiken.
### Stap 3: Link naar 2FA Instellingen Toevoegen
Voeg een link toe in het gebruikersmenu zodat gebruikers hun 2FA kunnen beheren:
Voorbeeld locatie: In uw hoofdnavigatie of gebruikersprofiel menu:
```html
<li>
<a href="/beheer/TwoFactorController">
<i class="icon wb-lock"></i>
<span>2FA Instellingen</span>
</a>
</li>
```
Of in een dropdown menu:
```html
<a class="dropdown-item" href="/beheer/TwoFactorController">
<i class="icon wb-lock"></i> Tweefactorauthenticatie
</a>
```
### Stap 4: Test de Implementatie
1. Log in als testgebruiker
2. Ga naar `/beheer/TwoFactorController`
3. Schakel 2FA in met e-mail methode
4. Log uit en log opnieuw in
5. Verifieer dat u de OTP code ontvangt en kunt invoeren
6. Test ook de Google Authenticator methode
---
## Gebruikers Helpen met 2FA Setup
### E-mail OTP Methode Instellen
**Stap 1**: Gebruiker gaat naar 2FA Instellingen
- URL: `/beheer/TwoFactorController`
- Of via menu: Gebruikersprofiel → 2FA Instellingen
**Stap 2**: E-mail methode selecteren
- Klik op het "E-mail" kaartje
- Klik op "2FA Inschakelen"
**Stap 3**: Bevestiging
- Gebruiker ziet melding: "Tweefactorauthenticatie ingeschakeld"
- Pagina toont huidige status: E-mail methode actief
**Stap 4**: Testen
- Log uit
- Log opnieuw in met gebruikersnaam en wachtwoord
- Controleer e-mail inbox (en spam folder!)
- Voer 6-cijferige code in
- Klik "Verifiëren"
**Tips voor gebruikers**:
- Bewaar de DBOIS e-mail adres (noreply@dbois.nl) in contacten om te voorkomen dat mails in spam terechtkomen
- Codes zijn 10 minuten geldig
- Nieuwe code kan worden aangevraagd met "Code opnieuw verzenden"
### Google Authenticator Methode Instellen
**Stap 1**: Authenticator App Installeren
- iOS: Download "Google Authenticator" of "Microsoft Authenticator" uit App Store
- Android: Download "Google Authenticator" of "Microsoft Authenticator" uit Play Store
- Alternatief: Authy (multi-device ondersteuning)
**Stap 2**: 2FA Instellingen Openen
- Ga naar `/beheer/TwoFactorController`
**Stap 3**: Google Authenticator Selecteren
- Klik op het "Google Authenticator" kaartje
- Klik op "2FA Inschakelen"
**Stap 4**: QR Code Scannen
- Een QR code verschijnt op het scherm
- Open de authenticator app op de telefoon
- Klik op "+" of "Account toevoegen"
- Selecteer "QR code scannen"
- Scan de QR code op het scherm
- DBOIS verschijnt nu in de app met een 6-cijferige code
**Stap 5**: Verificatie
- De 6-cijferige code in de app verandert elke 30 seconden
- Voer de huidige code in op het verificatiescherm
- Klik "Verifiëren"
- Bij succes: 2FA is nu actief
**Stap 6**: Testen
- Log uit
- Log opnieuw in
- Open authenticator app
- Voer de 6-cijferige code in (let op: code verandert elke 30 seconden!)
- Klik "Verifiëren"
**Belangrijk voor gebruikers**:
- ⚠️ **Bewaar de QR code of secret code veilig** (screenshot maken en veilig opslaan)
- Als telefoon verloren gaat, kan de QR code gebruikt worden om opnieuw in te stellen
- Codes zijn 30 seconden geldig
- Zorg dat de tijd op de telefoon correct is ingesteld (belangrijk voor TOTP!)
### Methode Wijzigen
Gebruikers kunnen later van methode wisselen:
1. Ga naar 2FA Instellingen
2. Selecteer een andere methode (E-mail of Google Authenticator)
3. Klik "Methode Wijzigen"
4. Volg de setup stappen voor de nieuwe methode
### 2FA Uitschakelen
Als een gebruiker 2FA wil uitschakelen:
1. Ga naar 2FA Instellingen
2. Scroll naar beneden
3. Klik op rode knop "2FA Uitschakelen"
4. Bevestig de actie
**Let op**: Vanuit beveiligingsperspectief raden we aan om 2FA verplicht te stellen voor beheerders en gebruikers met gevoelige toegang.
---
## Veelvoorkomende Problemen Oplossen
### Probleem 1: E-mail OTP Niet Ontvangen
**Diagnose checklist**:
- [ ] Is de e-mail configuratie correct? (test met wachtwoord-vergeten functie)
- [ ] Controleer spam/junk folder
- [ ] Is het e-mailadres van de gebruiker correct in de database?
- [ ] Controleer applicatie logs voor e-mail fouten
**Oplossing A: E-mail Configuratie Controleren**
1. Test de e-mail functionaliteit:
```php
// In een test controller
$this->load->library('email');
$this->email->from('noreply@dbois.nl', 'DBOIS');
$this->email->to('uw@email.nl');
$this->email->subject('Test');
$this->email->message('Test bericht');
if (!$this->email->send()) {
echo $this->email->print_debugger();
}
```
2. Controleer SMTP instellingen in `application/config/email.php`
3. Controleer firewall/server configuratie voor uitgaande SMTP
**Oplossing B: Code Opnieuw Verzenden**
1. Gebruiker klikt op "Code opnieuw verzenden" op de verificatiepagina
2. Check of nieuwe code wordt verzonden
3. Controleer spam folder
**Oplossing C: Tijdelijk Uitschakelen**
Als beheerder kunt u 2FA tijdelijk uitschakelen (zie [Gebruikers Deblokkeren](#gebruikers-deblokkeren))
### Probleem 2: Authenticator Code Werkt Niet
**Meest voorkomende oorzaken**:
**A. Tijd Niet Gesynchroniseerd**
- Authenticator codes zijn tijd-gebaseerd
- Als de klok van de telefoon niet correct is, werken codes niet
**Oplossing**:
1. Ga naar telefooninstellingen
2. Schakel "Automatische datum en tijd" in
3. Of handmatig de juiste tijd instellen
4. **Voor Android**: In Google Authenticator app → Menu → Instellingen → Tijd correctie voor codes → Synchroniseer nu
5. Probeer opnieuw in te loggen
**B. Verkeerde QR Code Gescand**
- Mogelijk oude QR code gebruikt
- QR code van andere account gescand
**Oplossing**:
1. Verwijder het DBOIS account uit de authenticator app
2. Log in op DBOIS (beheerder schakelt 2FA tijdelijk uit)
3. Ga naar 2FA instellingen
4. Schakel 2FA opnieuw in
5. Scan de nieuwe QR code
**C. Te Lang Gewacht met Code Invoeren**
- Codes zijn 30 seconden geldig
- Als code bijna verlopen is bij invoeren, kan validatie falen
**Oplossing**:
- Wacht op nieuwe code (elke 30 seconden)
- Voer code direct in zodra deze verschijnt
### Probleem 3: Gebruiker Zit Vast op Verificatiepagina
**Symptoom**: Gebruiker blijft hangen op `/login/showVerify2fa`
**Diagnose**:
- Session data mogelijk corrupt
- Browser cookies geblokkeerd
**Oplossing A: Via Browser**
- Klik op "Annuleren" link onderaan de verificatiepagina
- Dit redirect terug naar login pagina
**Oplossing B: Via Database** (als beheerder)
```sql
-- Verwijder actieve sessies voor deze gebruiker
DELETE FROM ci_sessions
WHERE data LIKE '%pending_2fa_user_id%';
```
**Oplossing C: Browser Cache Wissen**
1. Wis browser cookies en cache
2. Sluit browser volledig
3. Open opnieuw en probeer in te loggen
### Probleem 4: QR Code Wordt Niet Weergegeven
**Oorzaken**:
- JavaScript errors
- Browser compatibiliteit
- Netwerk problemen
**Oplossing**:
1. Check browser console voor errors (F12 → Console tab)
2. Probeer andere browser (Chrome, Firefox, Safari)
3. Controleer dat JavaScript enabled is
4. Refresh de pagina (Ctrl+F5 of Cmd+Shift+R)
**Alternatief: Handmatige Code Invoer**
- Onder de QR code staat een tekstuele secret code
- Deze kan handmatig worden ingevoerd in de authenticator app:
1. Open authenticator app
2. Klik "+" → "Enter a setup key"
3. Voer account naam in: DBOIS
4. Voer de secret code in
5. Selecteer "Time based"
6. Opslaan
### Probleem 5: "Ongeldige Verificatiecode" Foutmelding
**Mogelijke oorzaken en oplossingen**:
**A. Code Verlopen**
- E-mail codes: 10 minuten geldig
- Authenticator codes: 30 seconden geldig
**Oplossing**: Gebruik een nieuwe/actuele code
**B. Typfout**
- Code incorrect overgetypt
- Letters gebruikt in plaats van cijfers (O vs 0)
**Oplossing**: Zorgvuldig code opnieuw invoeren, gebruik copy-paste voor e-mail codes
**C. Meerdere Pogingen**
- Code al gebruikt
- Multiple browser tabs/windows
**Oplossing**:
- Voor e-mail: vraag nieuwe code aan
- Voor authenticator: wacht op nieuwe code
**D. Database Problemen**
- OTP record niet gevonden
- Session data verloren
**Oplossing**: Beheerder reset 2FA (zie volgende sectie)
---
## Gebruikers Deblokkeren
### Scenario 1: Gebruiker Heeft Toegang Tot Telefoon/E-mail Verloren
**Situatie**: Gebruiker kan niet inloggen omdat:
- Telefoon verloren/gestolen/kapot
- Geen toegang tot e-mail
- Authenticator app verwijderd
**Oplossing: 2FA Handmatig Uitschakelen**
#### Methode A: Via Database (Meest Direct)
1. Log in op MySQL/phpMyAdmin
2. Voer deze query uit:
```sql
-- Zoek de gebruiker
SELECT id, username, email, two_factor_enabled, two_factor_method
FROM users
WHERE username = 'gebruikersnaam';
-- Schakel 2FA uit voor deze gebruiker
UPDATE users
SET
two_factor_enabled = 'F',
two_factor_method = NULL,
two_factor_secret = NULL
WHERE id = [user_id];
-- Verwijder eventuele OTP codes
DELETE FROM user_otp_codes WHERE user_id = [user_id];
```
3. Gebruiker kan nu inloggen met alleen wachtwoord
4. Adviseer gebruiker om 2FA opnieuw in te stellen
#### Methode B: Via PHP Script
Maak een tijdelijk PHP bestand `disable_2fa.php` in de root:
```php
<?php
// BELANGRIJK: Verwijder dit bestand na gebruik!
// Alleen voor noodgevallen
require_once 'system/core/CodeIgniter.php';
$username = 'gebruikersnaam'; // Wijzig dit
$CI =& get_instance();
$CI->load->database();
$CI->load->model('beheer/User_model');
// Haal gebruiker op
$user = $CI->User_model->getUserByUsername($username);
if (!$user) {
echo "Gebruiker niet gevonden";
exit;
}
// Update database
$data = [
'two_factor_enabled' => 'F',
'two_factor_method' => NULL,
'two_factor_secret' => NULL
];
$CI->User_model->update_record($user->id, $data);
echo "2FA uitgeschakeld voor gebruiker: " . $username;
echo "\n<br>Gebruiker kan nu inloggen met alleen wachtwoord";
echo "\n<br><strong>VERWIJDER DIT BESTAND!</strong>";
?>
```
Gebruik:
1. Upload `disable_2fa.php` naar DBOIS root directory
2. Ga naar `https://uwdomain.nl/dbois/disable_2fa.php`
3. **BELANGRIJK: Verwijder het bestand direct na gebruik!**
### Scenario 2: Massa-Reset (Meerdere Gebruikers)
**Situatie**: Na een incident moeten meerdere gebruikers gereset worden.
**Oplossing: Bulk Database Update**
```sql
-- Schakel 2FA uit voor alle gebruikers
UPDATE users
SET
two_factor_enabled = 'F',
two_factor_method = NULL,
two_factor_secret = NULL;
-- Verwijder alle OTP codes
TRUNCATE TABLE user_otp_codes;
```
**Let op**: Alleen in noodgevallen gebruiken! Vraag gebruikers daarna 2FA opnieuw in te stellen.
### Scenario 3: Gebruiker Kan Geen Nieuwe Codes Ontvangen
**E-mail Methode**: Oude codes nog steeds verzonden, nieuwe codes komen niet aan
**Diagnose**:
```sql
-- Controleer actieve OTP codes voor gebruiker
SELECT * FROM user_otp_codes
WHERE user_id = [user_id]
AND used = 'F'
AND expires_at > NOW()
ORDER BY created_at DESC;
```
**Oplossing: OTP Codes Wissen**
```sql
-- Verwijder alle OTP codes voor deze gebruiker
DELETE FROM user_otp_codes WHERE user_id = [user_id];
```
Nu kan gebruiker nieuwe code aanvragen.
### Best Practices voor Deblokkering
1. **Identificatie Verifiëren**: Zorg dat u de identiteit van de gebruiker verifieert voordat u 2FA uitschakelt
- Telefonisch contact met bekend nummer
- In persoon verificatie
- Via manager/supervisor
2. **Documenteer de Actie**: Houd bij wanneer en waarom 2FA werd uitgeschakeld
```
[Datum] - 2FA uitgeschakeld voor [gebruiker] - Reden: [telefoon verloren]
```
3. **Tijdelijke Uitschakeling**: Geef gebruiker beperkte tijd om 2FA opnieuw in te stellen
- Mail de gebruiker met instructies
- Stel deadline (bijv. 24 uur)
4. **Wachtwoord Reset Overwegen**: Als veiligheidsrisico groot is, forceer ook wachtwoord wijziging
```sql
-- Dit forceert wachtwoord reset bij volgende login (indien geïmplementeerd)
UPDATE users SET password_reset_required = 'T' WHERE id = [user_id];
```
---
## Best Practices
### Voor Beheerders
#### 1. Verplicht 2FA voor Gevoelige Accounts
Overweeg 2FA verplicht te stellen voor:
- Alle beheerders
- Gebruikers met financiële toegang
- Gebruikers met toegang tot persoonlijke data
Implementatie:
```php
// In MY_Controller of inlog verificatie
if ($user->role <= 2 && $user->two_factor_enabled !== 'T') {
// Redirect naar 2FA setup met melding
redirect('/beheer/TwoFactorController?required=true');
}
```
#### 2. Regelmatig OTP Codes Opschonen
Voeg een cron job of scheduled task toe:
```bash
# Dagelijks om 03:00
0 3 * * * curl -s https://uwdomain.nl/dbois/maintenance/cleanup2fa
```
PHP endpoint (`maintenance/cleanup2fa`):
```php
public function cleanup2fa() {
$this->load->model('beheer/UserOtp_model');
$deleted = $this->UserOtp_model->cleanupExpiredOTPs();
log_message('info', "2FA Cleanup: {$deleted} expired OTP codes deleted");
}
```
#### 3. Monitor 2FA Adoptie
Track hoeveel gebruikers 2FA hebben ingeschakeld:
```sql
-- 2FA statistieken
SELECT
COUNT(*) as total_users,
SUM(CASE WHEN two_factor_enabled = 'T' THEN 1 ELSE 0 END) as users_with_2fa,
SUM(CASE WHEN two_factor_method = 'email' THEN 1 ELSE 0 END) as email_method,
SUM(CASE WHEN two_factor_method = 'authenticator' THEN 1 ELSE 0 END) as authenticator_method,
ROUND(SUM(CASE WHEN two_factor_enabled = 'T' THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) as adoption_percentage
FROM users
WHERE archive = 'F';
```
#### 4. Backup Strategie
Voor Google Authenticator gebruikers:
- Adviseer gebruikers om QR code screenshot veilig op te slaan
- Of secret code op veilige plek te bewaren
- Overweeg gebruik van Authy (cloud backup functionaliteit)
#### 5. Communicatie
**Bij Uitrol**:
- Stuur e-mail aankondiging 1 week van tevoren
- Organiseer training sessies of demo's
- Maak instructie video's beschikbaar
- Bied helpdesk ondersteuning
**Ongoing**:
- Voeg 2FA info toe aan onboarding proces
- Herinner gebruikers zonder 2FA periodiek
- Share security awareness tips
### Voor Eindgebruikers
#### Do's
✅ Schakel 2FA in voor extra beveiliging
✅ Gebruik Google Authenticator voor maximale veiligheid
✅ Bewaar QR code of secret code veilig
✅ Test 2FA setup direct na instellen
✅ Update telefoonnummer en e-mail adres in profiel
✅ Gebruik een app met backup (zoals Authy)
#### Don'ts
❌ Deel nooit uw 2FA codes
❌ Screenshot QR codes niet in onbeveiligde cloud
❌ Gebruik geen publieke computers voor 2FA setup
❌ Negeer niet 2FA waarschuwingen
❌ Gebruik niet hetzelfde apparaat voor wachtwoord manager én 2FA (voor maximale veiligheid)
---
## Veelgestelde Vragen
### Algemeen
**Q: Is 2FA verplicht?**
A: Dit hangt af van uw organisatie beleid. Standaard is 2FA optioneel, maar beheerders kunnen het verplicht stellen voor specifieke rollen.
**Q: Welke methode is veiliger?**
A: Google Authenticator is veiliger omdat het niet afhankelijk is van e-mailbeveiliging en werkt zonder internetverbinding. E-mail OTP is echter gemakkelijker voor minder technische gebruikers.
**Q: Hoelang duren codes?**
A: E-mail codes zijn 10 minuten geldig. Authenticator codes zijn 30 seconden geldig maar kunnen worden ingevoerd binnen een window van ±30 seconden (voor clock drift).
**Q: Wat als ik een nieuwe telefoon krijg?**
A: Voor authenticator methode: gebruik de opgeslagen QR code of secret code om op nieuwe telefoon in te stellen. Of: schakel 2FA uit, log in, schakel opnieuw in met nieuwe QR code.
**Q: Kan ik 2FA overslaan op vertrouwde apparaten?**
A: Deze functionaliteit is momenteel niet beschikbaar maar staat op de roadmap voor toekomstige updates.
### Technisch
**Q: Wordt mijn secret code versleuteld opgeslagen?**
A: De TOTP secret wordt opgeslagen in de database. Voor productie omgevingen wordt aanbevolen database encryptie te implementeren.
**Q: Wat gebeurt er met actieve sessies als ik 2FA inschakel?**
A: Bestaande sessies blijven actief. 2FA wordt alleen gevraagd bij nieuwe logins.
**Q: Kan ik zien wie 2FA heeft ingeschakeld?**
A: Ja, beheerders kunnen dit bekijken via database query:
```sql
SELECT username, email, two_factor_enabled, two_factor_method
FROM users
WHERE archive = 'F'
ORDER BY two_factor_enabled DESC;
```
**Q: Hoeveel mislukte 2FA pogingen zijn toegestaan?**
A: Er is momenteel geen ingebouwde rate limiting. Dit kan worden toegevoegd voor extra beveiliging.
### Problemen
**Q: Ik zie "Session expired" na 2FA verificatie**
A: Dit kan gebeuren als de database session te snel vervalt. Check de `ci_sessions` tabel en verhoog eventueel de session timeout in config.
**Q: E-mails komen aan in spam**
A: Vraag gebruikers om noreply@dbois.nl toe te voegen aan hun contacten en as "not spam" te markeren. Controleer ook SPF/DKIM records van uw domein.
**Q: Gebruiker ziet witte pagina na QR scan**
A: Check voor JavaScript errors in browser console. Mogelijk browser compatibiliteit issue - probeer andere browser.
---
## Ondersteuning en Contact
### Bij Problemen
1. **Check eerst deze handleiding** voor standaard oplossingen
2. **Controleer logs**:
- Application logs: `application/logs/`
- Server logs: afhankelijk van uw server setup
3. **Test in andere browser** om browser-specifieke issues uit te sluiten
4. **Database backup**: Maak altijd eerst een backup voordat u database wijzigingen doorvoert
### Escalatie
Als probleem niet opgelost kan worden:
- Contact development team
- Verstrek: gebruikersnaam, error messages, browser/device info, screenshots
### Documentatie Updates
Deze handleiding wordt bijgewerkt bij nieuwe features of veelvoorkomende issues. Check regelmatig voor updates.
---
## Appendix: Database Schema
### users tabel (relevante kolommen)
```sql
`two_factor_enabled` VARCHAR(1) NOT NULL DEFAULT 'F'
-- 'T' = enabled, 'F' = disabled
`two_factor_method` VARCHAR(20) NULL DEFAULT NULL
-- 'email' of 'authenticator'
`two_factor_secret` VARCHAR(255) NULL DEFAULT NULL
-- TOTP secret voor Google Authenticator (Base32 encoded)
```
### user_otp_codes tabel
```sql
CREATE TABLE `user_otp_codes` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(11) UNSIGNED NOT NULL,
`otp_code` VARCHAR(6) NOT NULL,
`expires_at` TIMESTAMP NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`used` VARCHAR(1) NOT NULL DEFAULT 'F',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_expires_at` (`expires_at`),
CONSTRAINT `fk_otp_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
---
**Laatst bijgewerkt**: 2025-10-17
**Versie**: 1.0
**Geschreven voor**: DBOIS Beheerders