| Server IP : 193.86.120.172 / Your IP : 216.73.216.215 Web Server : Apache/2.4.63 (Unix) System : Linux JServices 3.10.108 #86003 SMP Wed Oct 22 13:20:46 CST 2025 x86_64 User : kubec ( 1026) PHP Version : 8.2.28 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /volume1/web/kadernictvidenisa_cz/api/ |
Upload File : |
<?php
// ============================================
// api/auth.php
// POST /api/auth/login – přihlásit admina
// POST /api/auth/logout – odhlásit
// ============================================
// Tato funkce se volá z jiných souborů pro ověření
function admin_required(): void {
$token = null;
// Bearer token z hlavičky Authorization
$auth_header = $_SERVER['HTTP_AUTHORIZATION'] ?? ($_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? '');
if (preg_match('/Bearer\s+(.+)/i', $auth_header, $m)) {
$token = $m[1];
}
if (!$token) {
json_error('Přístup odepřen. Přihlaste se.', 401);
}
// Ověření tokenu v DB (session tokeny)
$stmt = db()->prepare("
SELECT au.id FROM admin_session s
JOIN admin_uzivatele au ON au.id = s.user_id
WHERE s.token = ? AND s.platnost_do > NOW()
");
$stmt->execute([$token]);
if (!$stmt->fetch()) {
json_error('Relace vypršela. Přihlaste se znovu.', 401);
}
}
// --- Login / Logout ---
if (!isset($resource)) { $resource = ''; }
$sub = $parts[1] ?? '';
if ($method === 'POST' && $sub === 'login') {
$uzivatelske_jmeno = sanitize($input['uzivatelske_jmeno'] ?? '');
$heslo = $input['heslo'] ?? '';
if (!$uzivatelske_jmeno || !$heslo) {
json_error('Vyplňte uživatelské jméno a heslo.');
}
$stmt = db()->prepare("SELECT id, heslo_hash FROM admin_uzivatele WHERE uzivatelske_jmeno = ?");
$stmt->execute([$uzivatelske_jmeno]);
$user = $stmt->fetch();
if (!$user || !password_verify($heslo, $user['heslo_hash'])) {
// Záměrné zpomalení proti brute-force
sleep(1);
json_error('Nesprávné přihlašovací údaje.', 401);
}
// Vygeneruj session token
$remember_me = !empty($input['remember_me']);
$interval = $remember_me ? 'INTERVAL 90 DAY' : 'INTERVAL 24 HOUR';
$session_token = generate_token();
db()->prepare("
INSERT INTO admin_session (user_id, token, platnost_do)
VALUES (?, ?, DATE_ADD(NOW(), $interval))
")->execute([$user['id'], $session_token]);
json_response(['ok' => true, 'token' => $session_token, 'uzivatel' => $uzivatelske_jmeno, 'remember_me' => $remember_me]);
}
if ($method === 'POST' && $sub === 'logout') {
$auth_header = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearer\s+(.+)/i', $auth_header, $m)) {
db()->prepare("DELETE FROM admin_session WHERE token = ?")->execute([$m[1]]);
}
json_response(['ok' => true]);
}
// GET /api/auth/check — ověř platnost tokenu
if ($method === 'GET' && $sub === 'check') {
$auth_header = $_SERVER['HTTP_AUTHORIZATION'] ?? ($_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? '');
preg_match('/Bearer\s+(.+)/i', $auth_header, $m);
$check_token = $m[1] ?? '';
if (!$check_token) json_error('Chybí token.', 401);
$stmt = db()->prepare("
SELECT au.uzivatelske_jmeno
FROM admin_session s
JOIN admin_uzivatele au ON au.id = s.user_id
WHERE s.token = ? AND s.platnost_do > NOW()
");
$stmt->execute([$check_token]);
$user = $stmt->fetch();
if (!$user) json_error('Token vypršel.', 401);
// Obnov platnost tokenu o 30 dní
db()->prepare("UPDATE admin_session SET platnost_do = DATE_ADD(NOW(), INTERVAL 90 DAY) WHERE token = ?")
->execute([$check_token]);
json_response(['ok' => true, 'uzivatel' => $user['uzivatelske_jmeno']]);
}
// Pouze při přímém volání /api/auth/* vrátíme chybu
if ($resource === 'auth') {
json_error('Neznámý auth endpoint.', 404);
}