prepare("SELECT id, name, email, password_hash, two_factor_secret, two_factor_enabled FROM users WHERE email = ?"); $stmt->execute([$email]); $user = $stmt->fetch(); if ($user && password_verify($password, $user['password_hash'])) { // Succesvol stap 1: zet tijdelijke pending sessie voor 2FA $_SESSION['pending_2fa_user_id'] = $user['id']; $_SESSION['pending_2fa_user_email'] = $user['email']; $_SESSION['pending_2fa_user_name'] = $user['name']; $step = 2; } else { $error = "Onjuist e-mailadres of wachtwoord."; } } } // STAP 2: 2FA TOTP Code verificatie elseif ($step === 2) { $userId = $_SESSION['pending_2fa_user_id'] ?? null; $totpCode = trim(str_replace(' ', '', $_POST['totp_code'] ?? '')); if (!$userId || empty($totpCode)) { $error = "Vul de 6-cijferige 2FA verificatiecode in."; } else { $stmt = $db->prepare("SELECT id, name, email, role, two_factor_secret, backup_codes FROM users WHERE id = ?"); $stmt->execute([$userId]); $user = $stmt->fetch(); $isValid = false; // 1. Controleer TOTP code if (!empty($user['two_factor_secret']) && TOTP::verifyCode($user['two_factor_secret'], $totpCode)) { $isValid = true; } // 2. Controleer optioneel backup codes if (!$isValid && !empty($user['backup_codes'])) { $backupCodes = json_decode($user['backup_codes'], true) ?: []; $codeUpper = strtoupper($totpCode); $key = array_search($codeUpper, $backupCodes); if ($key !== false) { $isValid = true; // Verbruik de backup code unset($backupCodes[$key]); $stmtUpdate = $db->prepare("UPDATE users SET backup_codes = ? WHERE id = ?"); $stmtUpdate->execute([json_encode(array_values($backupCodes)), $userId]); } } if ($isValid) { // Volledige login succesvol $_SESSION['user_id'] = $user['id']; $_SESSION['user_name'] = $user['name']; $_SESSION['user_email'] = $user['email']; $_SESSION['user_role'] = $user['role']; $_SESSION['is_2fa_verified'] = true; // Activeer persistente remember token (30 dagen blijf ingelogd) issue_remember_token((int)$user['id']); unset($_SESSION['pending_2fa_user_id'], $_SESSION['pending_2fa_user_email'], $_SESSION['pending_2fa_user_name']); header('Location: /planner.php'); exit; } else { $error = "Onjuiste 2FA code. Controleer uw authenticator app en probeer opnieuw."; } } } } $pageTitle = "Fociz — Inloggen"; ?>
Veilig inloggen met tweestapsverificatie (2FA)