Files
orc-order-v2/web/backend/auth/dependencies.py
T

59 lines
2.0 KiB
Python

"""FastAPI auth dependencies"""
from fastapi import Depends, HTTPException, status, Query, Request
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from web.backend.auth.jwt_handler import decode_token
security = HTTPBearer()
async def get_current_user(
credentials: HTTPAuthorizationCredentials = Depends(security),
) -> dict:
try:
payload = decode_token(credentials.credentials)
username = payload.get("sub")
if username is None:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
return {"username": username}
except Exception:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据")
async def get_current_user_ws(token: str = Query(...)) -> dict:
"""WebSocket auth via query parameter"""
try:
payload = decode_token(token)
username = payload.get("sub")
if username is None:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
return {"username": username}
except Exception:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据")
async def get_current_user_flexible(
request: Request,
credentials: HTTPAuthorizationCredentials = Depends(HTTPBearer(auto_error=False)),
token: str = Query(None),
) -> dict:
"""Auth from header OR query param (for file downloads in browser)."""
token_str = None
if credentials:
token_str = credentials.credentials
elif token:
token_str = token
if not token_str:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="未提供认证凭据")
try:
payload = decode_token(token_str)
username = payload.get("sub")
if username is None:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED)
return {"username": username}
except Exception:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="无效的认证凭据")