File size: 1,323 Bytes
19adbbb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# auth.py
# 身份验证中间件,处理API请求的认证
from fastapi import Request, HTTPException
from functools import wraps
from config import AuthConfig
def verify_token(request: Request) -> bool:
"""验证请求中的Bearer Token
Args:
request: FastAPI请求对象
Returns:
bool: 令牌是否有效
"""
auth_header = request.headers.get('Authorization')
return AuthConfig.validate_token(auth_header)
def require_auth(func):
"""要求认证的装饰器
用法:
@require_auth
async def protected_route():
...
"""
@wraps(func)
async def wrapper(*args, **kwargs):
request = kwargs.get('request')
if not request:
for arg in args:
if isinstance(arg, Request):
request = arg
break
if not request:
raise HTTPException(status_code=500, detail="Internal server error")
if not verify_token(request):
raise HTTPException(
status_code=401,
detail="Invalid or missing authentication token",
headers={"WWW-Authenticate": "Bearer"}
)
return await func(*args, **kwargs)
return wrapper |