diff --git a/public/auth.php b/public/auth.php index bd8c766..d560f7c 100644 --- a/public/auth.php +++ b/public/auth.php @@ -1,25 +1,83 @@ 'authorization_code', + 'client_id' => $client_id, + 'client_secret' => $client_secret, + 'redirect_uri' => $redirect_uri, + 'code' => $_GET['code'] + ])); + + $response = curl_exec($ch); + curl_close($ch); + $data = json_decode($response, true); + + if (isset($data['access_token'])) { + // Erfolgreich eingeloggt + $_SESSION['authenticated'] = true; + + // Zurück zur ursprünglich angeforderten Route umleiten + $target = $_SESSION['auth_target_route'] ?? '/'; + header('Location: /' . ltrim($target, '/')); + exit; + } else { + die('Fehler bei der Token-Generierung: ' . htmlspecialchars($response)); + } } -// 2. Angeforderten Dateipfad ermitteln -$route = $_GET['route'] ?? ''; -$route = trim($route, '/'); +// 2. Authentifizierungsstatus prüfen +$is_logged_in = isset($_SESSION['authenticated']) && $_SESSION['authenticated'] === true; +if (!$is_logged_in) { + // Ursprüngliches Ziel speichern, um nach dem Login dorthin zurückzukehren + $_SESSION['auth_target_route'] = $_GET['route'] ?? ''; + + // CSRF-Schutz generieren + $_SESSION['oauth_state'] = bin2hex(random_bytes(16)); + + // Umleitung zur Authelia-Loginseite + $auth_url = $authelia_url . '/api/oidc/authorization?' . http_build_query([ + 'client_id' => $client_id, + 'response_type' => 'code', + 'redirect_uri' => $redirect_uri, + 'state' => $_SESSION['oauth_state'], + 'scope' => 'openid profile email' + ]); + + header('Location: ' . $auth_url); + exit; +} + +// 3. Auslieferung der statischen Astro-Datei +$route = $_GET['route'] ?? ''; + +// Wenn auth.php direkt aufgerufen wurde (z.B. nach Login-Callback ohne Ziel) +if ($route === '') { + header('Location: /'); + exit; +} + +$route = trim($route, '/'); $base_dir = realpath(__DIR__); $target_file = $base_dir . '/' . $route; -// Astro generiert Seiten standardmäßig als Verzeichnis mit einer index.html if (is_dir($target_file)) { $target_file = rtrim($target_file, '/') . '/index.html'; } elseif (!str_ends_with($target_file, '.html') && file_exists($target_file . '/index.html')) { @@ -28,16 +86,15 @@ if (is_dir($target_file)) { $target_file .= '.html'; } -// 3. Sicherheitsprüfung (Path Traversal verhindern) und Datei ausliefern $real_target = realpath($target_file); +// Path Traversal verhindern if ($real_target && file_exists($real_target) && strpos($real_target, $base_dir) === 0) { header('Content-Type: text/html'); readfile($real_target); exit; } -// Fallback header("HTTP/1.0 404 Not Found"); echo "404 - Geschützte Datei nicht gefunden"; exit; \ No newline at end of file