fooder-api/fooder/utils/jwt.py

37 lines
1 KiB
Python

from jose import jwt
from pydantic import BaseModel
from datetime import timedelta, datetime
from typing import ClassVar
from ..settings import settings
class Token(BaseModel):
exp: datetime
sub: int
secret_key: ClassVar[str]
expire_delta: ClassVar[timedelta]
@classmethod
def calculate_exp(cls, now: datetime) -> datetime:
return now + cls.expire_delta
@classmethod
def decode(cls, jwt_token: str | bytes) -> "Token":
data = jwt.decode(jwt_token, cls.secret_key, algorithms=[settings.ALGORITHM])
return cls(**data)
def encode(self) -> str:
data = self.model_dump()
data["sub"] = str(data["sub"])
return jwt.encode(data, self.secret_key, settings.ALGORITHM)
class AccessToken(Token):
secret_key = settings.SECRET_KEY
expire_delta = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
class RefreshToken(Token):
secret_key = settings.REFRESH_SECRET_KEY
expire_delta = timedelta(days=settings.REFRESH_TOKEN_EXPIRE_DAYS)