| from datetime import datetime, timedelta | 
| from jwt import encode, decode, exceptions | 
| from passlib.context import CryptContext | 
| from fastapi import HTTPException, status | 
|   | 
| from app.config.config import settings | 
| from app.models.user_model import UserModel | 
|   | 
| SECRET_KEY = settings.secret_key | 
| ALGORITHM = "HS256" | 
| ACCESS_TOKEN_EXPIRE_MINUTES = 3000 | 
|   | 
| pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") | 
|   | 
|   | 
| def verify_password(plain_password, hashed_password): | 
|     return pwd_context.verify(plain_password, hashed_password) | 
|   | 
|   | 
| def get_password_hash(password): | 
|     return pwd_context.hash(password) | 
|   | 
|   | 
| def authenticate_user(db, username: str, password: str): | 
|     user = db.query(UserModel).filter(UserModel.username == username).first() | 
|     if not user: | 
|         return False | 
|     if not verify_password(password, user.hashed_password): | 
|         return False | 
|     return user | 
|   | 
|   | 
| def create_access_token(data: dict, expires_delta: timedelta = None): | 
|     to_encode = data.copy() | 
|     if expires_delta: | 
|         expire = datetime.utcnow() + expires_delta | 
|     else: | 
|         expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) | 
|     to_encode.update({"exp": expire}) | 
|     encoded_jwt = encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) | 
|     return encoded_jwt | 
|   | 
|   | 
| def decode_access_token(token: str): | 
|     try: | 
|         payload = decode(token, SECRET_KEY, algorithms=[ALGORITHM]) | 
|         return payload | 
|     except exceptions.DecodeError: | 
|         raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials") |