[FÁZE-1][auth] Přidáno odhlášení s mazáním session a remember me cookie
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
// ============================================================
|
||||
// ODHLÁŠENÍ
|
||||
// ============================================================
|
||||
// Tento soubor zruší session a remember me cookie.
|
||||
// Uživatele přesměruje na přihlašovací stránku.
|
||||
//
|
||||
// Odhlášení se provádí přes POST formulář (ne přes odkaz GET),
|
||||
// aby nemohlo dojít k nechtěnému odhlášení např. načtením
|
||||
// obrázku nebo prefetchingem odkazu prohlížečem.
|
||||
// ============================================================
|
||||
|
||||
require_once __DIR__ . '/config.php';
|
||||
require_once __DIR__ . '/db.php';
|
||||
|
||||
session_name(SESSION_NAZEV);
|
||||
session_set_cookie_params([
|
||||
'lifetime' => 0,
|
||||
'path' => '/',
|
||||
'httponly' => true,
|
||||
'samesite' => 'Strict',
|
||||
// 'secure' => true,
|
||||
]);
|
||||
session_start();
|
||||
|
||||
// Přijímáme pouze POST požadavky
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
header('Location: ' . AUTH_LOGIN_URL);
|
||||
exit;
|
||||
}
|
||||
|
||||
// -- Ověření CSRF tokenu -------------------------------------
|
||||
$csrf_z_formulare = $_POST['csrf_token'] ?? '';
|
||||
$csrf_token = $_SESSION['csrf_token'] ?? '';
|
||||
|
||||
if (empty($csrf_token) || !hash_equals($csrf_token, $csrf_z_formulare)) {
|
||||
// Neplatný CSRF token – přesměrujeme bez odhlášení
|
||||
header('Location: ' . AUTH_LOGIN_URL);
|
||||
exit;
|
||||
}
|
||||
|
||||
// -- Smazání remember me tokenu z DB -------------------------
|
||||
// Smažeme pouze token pro tento konkrétní selector (toto zařízení),
|
||||
// ostatní zařízení uživatele zůstanou přihlášena
|
||||
if (isset($_COOKIE['auth_selector'])) {
|
||||
$stmt = $pdo->prepare("
|
||||
DELETE FROM `" . DB_TABULKA_TOKENY . "`
|
||||
WHERE `selector` = :selector
|
||||
");
|
||||
$stmt->execute([':selector' => $_COOKIE['auth_selector']]);
|
||||
}
|
||||
|
||||
// -- Smazání remember me cookies -----------------------------
|
||||
setcookie('auth_selector', '', [
|
||||
'expires' => time() - 3600,
|
||||
'path' => '/',
|
||||
'httponly' => true,
|
||||
'samesite' => 'Strict',
|
||||
]);
|
||||
setcookie('auth_token', '', [
|
||||
'expires' => time() - 3600,
|
||||
'path' => '/',
|
||||
'httponly' => true,
|
||||
'samesite' => 'Strict',
|
||||
]);
|
||||
|
||||
// -- Zrušení session -----------------------------------------
|
||||
// Vyprázdníme pole session
|
||||
$_SESSION = [];
|
||||
|
||||
// Smažeme session cookie z prohlížeče
|
||||
if (ini_get('session.use_cookies')) {
|
||||
$params = session_get_cookie_params();
|
||||
setcookie(
|
||||
session_name(),
|
||||
'',
|
||||
time() - 3600,
|
||||
$params['path'],
|
||||
$params['domain'],
|
||||
$params['secure'],
|
||||
$params['httponly']
|
||||
);
|
||||
}
|
||||
|
||||
// Zrušíme session na serveru
|
||||
session_destroy();
|
||||
|
||||
// -- Přesměrování na přihlašovací stránku -------------------
|
||||
header('Location: ' . AUTH_LOGIN_URL);
|
||||
exit;
|
||||
Reference in New Issue
Block a user