from datetime import datetime, timedelta, timezone from jose import jwt, JWTError from core.config import settings def create_access_token( subject: str, token_version: int, expires_delta: timedelta | None = None, ) -> str: if expires_delta: expire = datetime.now(timezone.utc) + expires_delta else: expire = datetime.now(timezone.utc) + timedelta( days=settings.ACCESS_TOKEN_EXPIRE_DAYS ) payload = { "sub": subject, "token_version": token_version, "exp": expire, } return jwt.encode( payload, settings.SECRET_KEY, algorithm=settings.ALGORITHM, ) def create_refresh_token( subject: str, token_version: int, expires_delta: timedelta | None = None, ) -> str: if expires_delta: expire = datetime.now(timezone.utc) + expires_delta else: expire = datetime.now(timezone.utc) + timedelta( weeks=settings.REFRESH_TOKEN_EXPIRE_WEEKS ) payload = { "sub": subject, "token_version": token_version, "exp": expire, "type": "refresh" } return jwt.encode( payload, settings.SECRET_KEY, algorithm=settings.ALGORITHM, ) def decode_token(token: str): try: payload = jwt.decode( token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM], ) return payload except JWTError: return None