| """ |
| 中间件配置模块,负责设置和配置应用程序的中间件 |
| """ |
|
|
| from fastapi import FastAPI, Request |
| from fastapi.middleware.cors import CORSMiddleware |
| from fastapi.responses import RedirectResponse |
| from starlette.middleware.base import BaseHTTPMiddleware |
|
|
| |
| from app.middleware.smart_routing_middleware import SmartRoutingMiddleware |
| from app.core.constants import API_VERSION |
| from app.core.security import verify_auth_token |
| from app.log.logger import get_middleware_logger |
|
|
| logger = get_middleware_logger() |
|
|
|
|
| class AuthMiddleware(BaseHTTPMiddleware): |
| """ |
| 认证中间件,处理未经身份验证的请求 |
| """ |
|
|
| async def dispatch(self, request: Request, call_next): |
| |
| if ( |
| request.url.path not in ["/", "/auth"] |
| and not request.url.path.startswith("/static") |
| and not request.url.path.startswith("/gemini") |
| and not request.url.path.startswith("/v1") |
| and not request.url.path.startswith(f"/{API_VERSION}") |
| and not request.url.path.startswith("/health") |
| and not request.url.path.startswith("/hf") |
| and not request.url.path.startswith("/openai") |
| and not request.url.path.startswith("/api/version/check") |
| and not request.url.path.startswith("/vertex-express") |
| and not request.url.path.startswith("/upload") |
| ): |
|
|
| auth_token = request.cookies.get("auth_token") |
| if not auth_token or not verify_auth_token(auth_token): |
| logger.warning(f"Unauthorized access attempt to {request.url.path}") |
| return RedirectResponse(url="/") |
| logger.debug("Request authenticated successfully") |
|
|
| response = await call_next(request) |
| return response |
|
|
|
|
| def setup_middlewares(app: FastAPI) -> None: |
| """ |
| 设置应用程序的中间件 |
| |
| Args: |
| app: FastAPI应用程序实例 |
| """ |
| |
| app.add_middleware(SmartRoutingMiddleware) |
|
|
| |
| app.add_middleware(AuthMiddleware) |
|
|
| |
| |
|
|
| |
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=["*"], |
| allow_credentials=True, |
| allow_methods=[ |
| "GET", |
| "POST", |
| "PUT", |
| "DELETE", |
| "OPTIONS", |
| ], |
| allow_headers=["*"], |
| expose_headers=["*"], |
| max_age=600, |
| ) |
|
|