Login umgestellt auf tokem je Gerät
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
45
login.php
45
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.";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
@@ -56,31 +55,22 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>DoMiLi – Login</title>
|
||||
<!-- Bootstrap CSS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<!-- Google Fonts Icons -->
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined" rel="stylesheet">
|
||||
<!-- Custom styles -->
|
||||
<link rel="stylesheet" href="css/style.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container d-flex justify-content-center align-items-start min-vh-100 py-4 pt-5">
|
||||
<div class="container d-flex justify-content-center align-items-start py-4 pt-5">
|
||||
<div class="card bg-light shadow w-100" style="max-width: 400px;">
|
||||
<div class="card-body">
|
||||
<h4 class="card-title text-center mb-4 fs-3">DoMiLi Login</h4>
|
||||
|
||||
<?php if (isset($error)) {
|
||||
?>
|
||||
<?php if ($error) { ?>
|
||||
<div class="alert alert-danger" role="alert">
|
||||
<?php echo $error; ?>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
<?php } ?>
|
||||
<form method="post" action="">
|
||||
<div class="mb-3">
|
||||
<label for="username" class="form-label">Benutzername</label>
|
||||
@@ -97,6 +87,7 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php include('inc/footer.php'); ?>
|
||||
</body>
|
||||
|
||||
|
||||
<?php include('inc/footer.php'); ?>
|
||||
</html>
|
||||
25
logout.php
25
logout.php
@@ -1,17 +1,20 @@
|
||||
<?php
|
||||
// logout.php
|
||||
include('inc/db.php');
|
||||
|
||||
session_start(); // Session starten, bevor man sie zerstört
|
||||
session_start();
|
||||
|
||||
// Alle Session-Daten löschen
|
||||
$_SESSION = array();
|
||||
if (isset($_COOKIE['remember_token'])) {
|
||||
$token = $_COOKIE['remember_token'];
|
||||
|
||||
// Cookies löschen, indem ihr Verfallsdatum in die Vergangenheit gesetzt wird
|
||||
setcookie('auth_token', '', time() - 3600, "/");
|
||||
setcookie('user_id', '', time() - 3600, "/");
|
||||
$sql = "DELETE FROM login_tokens WHERE token = ?";
|
||||
$stmt = mysqli_prepare($conn, $sql);
|
||||
mysqli_stmt_bind_param($stmt, "s", $token);
|
||||
mysqli_stmt_execute($stmt);
|
||||
|
||||
setcookie('remember_token', '', time() - 3600, "/");
|
||||
}
|
||||
|
||||
// Session zerstören
|
||||
session_destroy();
|
||||
|
||||
// Weiterleitung zur Login-Seite
|
||||
header("Location: login.php");
|
||||
exit;
|
||||
header('Location: login.php');
|
||||
exit();
|
||||
|
||||
Reference in New Issue
Block a user