from fastapi import Request from starlette.middleware.base import BaseHTTPMiddleware from app.services.auth import decode_access_token _PUBLIC_PATHS = {"/api/v1/auth/login", "/api/v1/auth/refresh", "/docs", "/openapi.json", "/redoc"} class AuthMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): path = request.url.path if path in _PUBLIC_PATHS or path.startswith("/docs") or path.startswith("/redoc"): return await call_next(request) auth_header = request.headers.get("Authorization", "") if auth_header.startswith("Bearer "): token = auth_header[7:] user_id = decode_access_token(token) if user_id is not None: request.state.user_id = user_id else: request.state.user_id = None else: request.state.user_id = None return await call_next(request)