""" Security utilities for the sim-search API. This module provides utilities for password hashing, JWT token generation, and token validation. """ 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 # Password hashing context pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def verify_password(plain_password: str, hashed_password: str) -> bool: """ Verify a password against a hash. Args: plain_password: Plain text password hashed_password: Hashed password Returns: True if the password matches the hash, False otherwise """ return pwd_context.verify(plain_password, hashed_password) def get_password_hash(password: str) -> str: """ Hash a password. Args: password: Plain text password Returns: Hashed password """ return pwd_context.hash(password) def create_access_token( subject: Union[str, Any], expires_delta: Optional[timedelta] = None ) -> str: """ Create a JWT access token. Args: subject: Subject of the token (usually user ID) expires_delta: Optional expiration time delta Returns: JWT token as a string """ 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=settings.ALGORITHM ) return encoded_jwt