diff --git a/inc/check_login.php b/inc/check_login.php index 7e15b39..36d6428 100755 --- a/inc/check_login.php +++ b/inc/check_login.php @@ -1,66 +1,40 @@ $lifetime, - 'path' => '/', - 'samesite' => 'Lax' -]); - -session_start(); +// inc/check_login.php include('db.php'); -// Funktion zum Löschen von Cookies und Weiterleiten zum Login -function redirect_to_login() -{ - setcookie('auth_token', '', time() - 3600, "/"); - setcookie('user_id', '', time() - 3600, "/"); - $_SESSION = array(); - session_destroy(); - header("Location: ./login.php"); - exit; -} +session_start(); -// 1. Prüfen, ob bereits eine Session existiert -if (isset($_SESSION['user_id'])) { - return; // Benutzer ist bereits per Session angemeldet. -} +if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token'])) { + $token = $_COOKIE['remember_token']; -// 2. Ansonsten: Prüfen, ob Cookies vorhanden sind -if (isset($_COOKIE['auth_token']) && isset($_COOKIE['user_id'])) { - $cookie_token = $_COOKIE['auth_token']; - $cookie_user_id = $_COOKIE['user_id']; + // Prüfen, ob der Token in der Datenbank existiert und gültig ist + $sql = "SELECT users.id, users.username, users.email, users.role FROM login_tokens JOIN users ON login_tokens.user_id = users.id WHERE login_tokens.token = ? AND login_tokens.expires_at > NOW()"; + $stmt = mysqli_prepare($conn, $sql); + mysqli_stmt_bind_param($stmt, "s", $token); + mysqli_stmt_execute($stmt); + $result = mysqli_stmt_get_result($stmt); + $user = mysqli_fetch_assoc($result); - // Datenbank-Abfrage, um den Token und die vollständigen Benutzerdaten zu erhalten - $stmt = mysqli_prepare($conn, "SELECT id, login_token, username, email, role FROM users WHERE id = ?"); + if ($user) { + // Token ist gültig, alle Benutzerdaten in die Session laden + $_SESSION['user_id'] = $user['id']; + $_SESSION['username'] = $user['username']; + $_SESSION['email'] = $user['email']; + $_SESSION['role'] = $user['role']; - if ($stmt) { - mysqli_stmt_bind_param($stmt, "i", $cookie_user_id); - mysqli_stmt_execute($stmt); - $result = mysqli_stmt_get_result($stmt); - $user = mysqli_fetch_assoc($result); - mysqli_stmt_close($stmt); - - // 3. Tokens vergleichen - if ($user && $cookie_token === $user['login_token']) { - // Tokens stimmen überein, Benutzer per Cookie authentifizieren - // Jetzt die Benutzerdaten in die Session laden - $_SESSION['user_id'] = $user['id']; - $_SESSION['username'] = $user['username']; - $_SESSION['email'] = $user['email']; - $_SESSION['role'] = $user['role']; - - return; // Authentifizierung per Cookie erfolgreich, Skript fortsetzen - } + // Optional: Ablaufdatum des Tokens verlängern (Rolling Expiration) + $new_expires_at = date('Y-m-d H:i:s', strtotime('+30 days')); + $update_sql = "UPDATE login_tokens SET expires_at = ? WHERE token = ?"; + $update_stmt = mysqli_prepare($conn, $update_sql); + mysqli_stmt_bind_param($update_stmt, "ss", $new_expires_at, $token); + mysqli_stmt_execute($update_stmt); + } else { + // Token ist ungültig oder abgelaufen, Cookie löschen + setcookie('remember_token', '', time() - 3600, "/"); } } -// Wenn weder Session noch gültiger Cookie gefunden wurde -redirect_to_login(); +if (!isset($_SESSION['user_id'])) { + header('Location: login.php'); + exit(); +} diff --git a/login.php b/login.php index b8c0412..e6a7e93 100755 --- a/login.php +++ b/login.php @@ -2,12 +2,12 @@ session_start(); include('inc/db.php'); +$error = ''; if ($_SERVER["REQUEST_METHOD"] == "POST") { $username = $_POST['username']; $password = $_POST['password']; - // 1. Prepared Statement vorbereiten $stmt = mysqli_prepare($conn, "SELECT id, username, password, email, role FROM users WHERE username = ?"); if ($stmt) { mysqli_stmt_bind_param($stmt, "s", $username); @@ -23,18 +23,19 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { $_SESSION['email'] = $user['email']; $_SESSION['role'] = $user['role']; - // Token generieren und in der Datenbank speichern + // Neuen Login-Token für die geräteübergreifende Anmeldung erstellen $token = bin2hex(random_bytes(32)); - $update_stmt = mysqli_prepare($conn, "UPDATE users SET login_token = ? WHERE id = ?"); - if ($update_stmt) { - mysqli_stmt_bind_param($update_stmt, "si", $token, $user['id']); - mysqli_stmt_execute($update_stmt); - mysqli_stmt_close($update_stmt); - } + $expires_at = date('Y-m-d H:i:s', strtotime('+30 days')); - // Cookies setzen, die 30 Tage gültig sind - setcookie('auth_token', $token, time() + (86400 * 30), "/"); - setcookie('user_id', $user['id'], time() + (86400 * 30), "/"); + // Token in der neuen `login_tokens` Tabelle speichern + $sql_token = "INSERT INTO login_tokens (user_id, token, expires_at) VALUES (?, ?, ?)"; + $stmt_token = mysqli_prepare($conn, $sql_token); + mysqli_stmt_bind_param($stmt_token, "iss", $user['id'], $token, $expires_at); + mysqli_stmt_execute($stmt_token); + mysqli_stmt_close($stmt_token); + + // Cookie mit dem Token setzen + setcookie('remember_token', $token, time() + (86400 * 30), "/"); header("Location: index.php"); exit(); @@ -42,11 +43,9 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { $error = "Login fehlgeschlagen."; } } else { - // Fehler beim Vorbereiten des Statements $error = "Datenbankfehler."; } } - ?> @@ -56,31 +55,22 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {