__init__.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from datetime import datetime, timedelta
  2. from typing import Any, Optional
  3. from jose import jwt, JWTError
  4. from fastapi import Depends, HTTPException, status, Request
  5. from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
  6. from sqlalchemy.orm import Session
  7. from app.config import get_settings
  8. from app.database import get_db
  9. settings = get_settings()
  10. security = HTTPBearer(auto_error=False)
  11. def create_access_token(
  12. data: dict,
  13. expires_delta: Optional[timedelta] = None,
  14. ) -> str:
  15. to_encode = data.copy()
  16. expire = datetime.utcnow() + (expires_delta or timedelta(minutes=settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES))
  17. to_encode.update({"exp": expire})
  18. return jwt.encode(to_encode, settings.JWT_SECRET_KEY, algorithm=settings.JWT_ALGORITHM)
  19. def decode_access_token(token: str) -> dict:
  20. try:
  21. payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
  22. return payload
  23. except JWTError:
  24. raise HTTPException(
  25. status_code=status.HTTP_401_UNAUTHORIZED,
  26. detail="无效的认证凭证",
  27. )
  28. async def get_current_user(request: Request) -> dict:
  29. credentials: Optional[HTTPAuthorizationCredentials] = await security(request)
  30. if not credentials:
  31. raise HTTPException(
  32. status_code=status.HTTP_401_UNAUTHORIZED,
  33. detail="未提供认证凭证",
  34. )
  35. token = credentials.credentials
  36. payload = decode_access_token(token)
  37. return payload
  38. async def get_optional_user(request: Request) -> Optional[dict]:
  39. try:
  40. return await get_current_user(request)
  41. except HTTPException:
  42. return None