from datetime import datetime, timedelta from typing import Any, Optional, Union from jose import jwt from passlib.context import CryptContext from app.core.config import settings pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def create_access_token( subject: Union[str, Any], expires_delta: Optional[timedelta] = None ) -> str: """ Create a JWT access token for the given subject (user id). Args: subject: The subject (user id) for whom the token is being created. expires_delta: Optional timedelta for token expiration. If not provided, uses settings. Returns: str: Encoded JWT token """ if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta( minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES ) to_encode = {"exp": expire, "sub": str(subject)} encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm="HS256") return encoded_jwt def verify_password(plain_password: str, hashed_password: str) -> bool: """ Verify a plaintext password against its hash. Args: plain_password: The plaintext password hashed_password: The hashed password to check against Returns: bool: True if the password matches, False otherwise """ return pwd_context.verify(plain_password, hashed_password) def get_password_hash(password: str) -> str: """ Hash a password with bcrypt. Args: password: The plaintext password to hash Returns: str: The hashed password """ return pwd_context.hash(password)