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