deps.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. from typing import Generator, Optional
  2. from fastapi import Depends, HTTPException, status
  3. from fastapi.security import OAuth2PasswordBearer
  4. from jose import jwt, JWTError
  5. from sqlalchemy.orm import Session
  6. from backend.app.core.database import get_db
  7. from backend.app.core.config import settings
  8. from backend.app.models import sql_models
  9. from backend.app.schemas import schemas
  10. oauth2_scheme = OAuth2PasswordBearer(tokenUrl=f"{settings.API_V1_STR}/login")
  11. def get_current_user(
  12. db: Session = Depends(get_db),
  13. token: str = Depends(oauth2_scheme)
  14. ) -> sql_models.User:
  15. credentials_exception = HTTPException(
  16. status_code=status.HTTP_401_UNAUTHORIZED,
  17. detail="Could not validate credentials",
  18. headers={"WWW-Authenticate": "Bearer"},
  19. )
  20. try:
  21. payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
  22. username: str = payload.get("sub")
  23. if username is None:
  24. raise credentials_exception
  25. token_data = schemas.TokenData(username=username)
  26. except JWTError:
  27. raise credentials_exception
  28. user = db.query(sql_models.User).filter(sql_models.User.username == token_data.username).first()
  29. if user is None:
  30. raise credentials_exception
  31. return user
  32. def get_current_active_superuser(
  33. current_user: sql_models.User = Depends(get_current_user),
  34. ) -> sql_models.User:
  35. if not current_user.is_superuser:
  36. raise HTTPException(
  37. status_code=400, detail="The user doesn't have enough privileges"
  38. )
  39. return current_user