Login umgestellt auf tokem je Gerät

This commit is contained in:
Borgal
2025-08-14 21:37:04 +02:00
parent 54209f1126
commit 5ff1c87f6d
3 changed files with 62 additions and 94 deletions

View File

@@ -1,66 +1,40 @@
<?php
// Setze die Lebensdauer der Session auf 30 Tage (in Sekunden)
$lifetime = 60 * 60 * 24 * 30;
// Konfiguriere die Session-Einstellungen
ini_set('session.gc_maxlifetime', $lifetime); // Lebensdauer der Sitzungsdaten auf dem Server
ini_set('session.cookie_lifetime', $lifetime); // Lebensdauer des Cookies im Browser
// Setzt die Cookie-Parameter, um die Konsistenz zu gewährleisten
session_set_cookie_params([
'lifetime' => $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();
}