diff --git a/api.php b/api.php index f156a7b..cc5ca26 100644 --- a/api.php +++ b/api.php @@ -27,10 +27,42 @@ try { } catch (PDOException $e) { die(json_encode(["error" => "Connexion BDD échouée"])); } // --- Fonctions Utilitaires --- +// Récupère le token d'authentification envoyé par le client, en tolérant les +// configurations Apache/WAMP qui ne transmettent pas HTTP_AUTHORIZATION à PHP +// par défaut (l'en-tête est bien envoyé par le navigateur, mais Apache le +// "mange" avant qu'il n'atteigne $_SERVER, sauf si CGIPassAuth est activé). +function getAuthToken() { + if (!empty($_SERVER['HTTP_AUTHORIZATION'])) { + return $_SERVER['HTTP_AUTHORIZATION']; + } + // Cas fréquent avec RewriteRule / certains proxys : le header est déplacé ici + if (!empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { + return $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; + } + // Filet de sécurité générique : relire les en-têtes bruts de la requête + if (function_exists('getallheaders')) { + foreach (getallheaders() as $name => $value) { + if (strcasecmp($name, 'Authorization') === 0) { + return $value; + } + } + } elseif (function_exists('apache_request_headers')) { + foreach (apache_request_headers() as $name => $value) { + if (strcasecmp($name, 'Authorization') === 0) { + return $value; + } + } + } + return ''; +} + function checkAuth($pdo) { if ($pdo->query("SELECT COUNT(*) FROM users")->fetchColumn() == 0) return true; - $token = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; - if ($token !== md5(ENCRYPTION_KEY . 'session')) { http_response_code(403); exit; } + $token = getAuthToken(); + if ($token !== md5(ENCRYPTION_KEY . 'session')) { + error_log("Auth: ❌ Token invalide ou absent (HTTP_AUTHORIZATION reçu: " . (empty($token) ? "VIDE — vérifier CGIPassAuth/config Apache" : "présent mais différent") . ")"); + http_response_code(403); exit; + } } function encryptData($data) {