PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]); } /** * Bearer-Token aus dem Authorization-Header lesen, gegen tokens.token_hash prüfen * (SHA-256, der Klartext wird nie gespeichert) und den zugehörigen aktiven User zurückgeben. * Sendet bei fehlendem/ungültigem/abgelaufenem Token selbst eine 401-Antwort und beendet das Skript. */ function ai_backend_authenticate(PDO $pdo): array { $header = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; if (!preg_match('/^Bearer\s+(.+)$/i', $header, $m)) { ai_backend_fail(401, 'Kein gültiges Token übermittelt.'); } $tokenHash = hash('sha256', $m[1]); $stmt = $pdo->prepare( 'SELECT u.* FROM users u JOIN tokens t ON t.user_id = u.id WHERE t.token_hash = ? AND t.expires_at > NOW() AND u.is_active = 1 LIMIT 1' ); $stmt->execute([$tokenHash]); $user = $stmt->fetch(); if (!$user) { ai_backend_fail(401, 'Ungültiges oder abgelaufenes Token.'); } return $user; } /** Einheitliche Fehlerantwort als JSON, beendet danach das Skript. */ function ai_backend_fail(int $httpStatus, string $message): never { http_response_code($httpStatus); header('Content-Type: application/json'); echo json_encode(['error' => $message]); exit; }