|
|
""" |
|
|
中间件配置模块,负责设置和配置应用程序的中间件 |
|
|
""" |
|
|
|
|
|
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, |
|
|
) |
|
|
|