auth.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from datetime import datetime, timedelta
  2. from jwt import encode, decode, exceptions
  3. from passlib.context import CryptContext
  4. from fastapi import HTTPException, status
  5. from app.config.config import settings
  6. from app.models.user_model import UserModel
  7. SECRET_KEY = settings.secret_key
  8. ALGORITHM = "HS256"
  9. ACCESS_TOKEN_EXPIRE_MINUTES = 3000
  10. pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
  11. def verify_password(plain_password, hashed_password):
  12. return pwd_context.verify(plain_password, hashed_password)
  13. def get_password_hash(password):
  14. return pwd_context.hash(password)
  15. def authenticate_user(db, username: str, password: str):
  16. user = db.query(UserModel).filter(UserModel.username == username).first()
  17. if not user:
  18. return False
  19. if not verify_password(password, user.hashed_password):
  20. return False
  21. return user
  22. def create_access_token(data: dict, expires_delta: timedelta = None):
  23. to_encode = data.copy()
  24. if expires_delta:
  25. expire = datetime.utcnow() + expires_delta
  26. else:
  27. expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
  28. to_encode.update({"exp": expire})
  29. encoded_jwt = encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
  30. return encoded_jwt
  31. def decode_access_token(token: str):
  32. try:
  33. payload = decode(token, SECRET_KEY, algorithms=[ALGORITHM])
  34. return payload
  35. except exceptions.DecodeError:
  36. raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials")