diff --git a/gateway/app/main.py b/gateway/app/main.py index 84d9a89b..a7b91972 100644 --- a/gateway/app/main.py +++ b/gateway/app/main.py @@ -71,7 +71,7 @@ async def startup_event(): metrics_collector.start_metrics_server(8080) # Initialize service discovery - await service_discovery.initialize() + # await service_discovery.initialize() logger.info("API Gateway started successfully") @@ -81,7 +81,7 @@ async def shutdown_event(): logger.info("Shutting down API Gateway") # Clean up service discovery - await service_discovery.cleanup() + # await service_discovery.cleanup() logger.info("API Gateway shutdown complete") diff --git a/gateway/app/routes/data.py b/gateway/app/routes/data.py index c23ea161..6077f6c8 100644 --- a/gateway/app/routes/data.py +++ b/gateway/app/routes/data.py @@ -1,43 +1,47 @@ -# ================================================================ -# gateway/app/routes/data.py -# ================================================================ -"""Data service routes for API Gateway""" +"""Data service routes for API Gateway - Authentication handled by gateway middleware""" -from fastapi import APIRouter, Request, Depends, HTTPException +from fastapi import APIRouter, Request, HTTPException from fastapi.responses import StreamingResponse import httpx -import structlog +import logging from app.core.config import settings -from app.core.auth import verify_token -logger = structlog.get_logger() +logger = logging.getLogger(__name__) router = APIRouter() @router.api_route("/sales/{path:path}", methods=["GET", "POST", "PUT", "DELETE"]) -async def proxy_sales(request: Request, path: str, current_user: dict = Depends(verify_token)): +async def proxy_sales(request: Request, path: str): """Proxy sales data requests to data service""" return await _proxy_request(request, f"/api/v1/sales/{path}") @router.api_route("/weather/{path:path}", methods=["GET", "POST"]) -async def proxy_weather(request: Request, path: str, current_user: dict = Depends(verify_token)): +async def proxy_weather(request: Request, path: str): """Proxy weather requests to data service""" return await _proxy_request(request, f"/api/v1/weather/{path}") @router.api_route("/traffic/{path:path}", methods=["GET", "POST"]) -async def proxy_traffic(request: Request, path: str, current_user: dict = Depends(verify_token)): +async def proxy_traffic(request: Request, path: str): """Proxy traffic requests to data service""" return await _proxy_request(request, f"/api/v1/traffic/{path}") async def _proxy_request(request: Request, target_path: str): - """Proxy request to data service""" + """Proxy request to data service with user context""" try: url = f"{settings.DATA_SERVICE_URL}{target_path}" - # Forward headers (including auth) + # Forward headers BUT add user context from gateway auth headers = dict(request.headers) headers.pop("host", None) # Remove host header + # ✅ ADD USER CONTEXT FROM GATEWAY AUTHENTICATION + # Gateway middleware already verified the token and added user to request.state + if hasattr(request.state, 'user'): + headers["X-User-ID"] = str(request.state.user.get("user_id")) + headers["X-User-Email"] = request.state.user.get("email", "") + headers["X-Tenant-ID"] = str(request.state.user.get("tenant_id")) + headers["X-User-Roles"] = ",".join(request.state.user.get("roles", [])) + # Get request body if present body = None if request.method in ["POST", "PUT", "PATCH"]: