auth = new Auth($db, $_ENV['JWT_SECRET'] ?? 'default-secret'); } /** * Handle the middleware */ public function handle(): bool { $token = $this->getBearerToken(); if (!$token) { $this->sendUnauthorizedResponse('Authentication required'); return false; } $user = $this->auth->validateToken($token); if (!$user) { $this->sendUnauthorizedResponse('Invalid or expired token'); return false; } // Store user in global state for controllers to access $_SESSION['authenticated_user'] = $user; return true; } /** * Get Bearer token from Authorization header */ private function getBearerToken(): ?string { $headers = $this->getAuthorizationHeader(); if (!$headers) { return null; } if (preg_match('/Bearer\s+(.*)$/i', $headers, $matches)) { return $matches[1]; } return null; } /** * Get Authorization header */ private function getAuthorizationHeader(): ?string { $headers = null; // Try different server variables for Authorization header if (isset($_SERVER['Authorization'])) { $headers = trim($_SERVER['Authorization']); } elseif (isset($_SERVER['HTTP_AUTHORIZATION'])) { $headers = trim($_SERVER['HTTP_AUTHORIZATION']); } elseif (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { // For CGI/FastCGI environments $headers = trim($_SERVER['REDIRECT_HTTP_AUTHORIZATION']); } elseif (function_exists('apache_request_headers')) { $requestHeaders = apache_request_headers(); if ($requestHeaders) { $requestHeaders = array_combine( array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders) ); if (isset($requestHeaders['Authorization'])) { $headers = trim($requestHeaders['Authorization']); } } } return $headers; } /** * Send unauthorized response */ private function sendUnauthorizedResponse(string $message): void { http_response_code(401); header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'error' => 'Unauthorized', 'message' => $message ]); } }