37 lines
1 KiB
Python
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)
|