34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
from datetime import datetime, timedelta, timezone
|
|
import jwt
|
|
from enum import Enum
|
|
|
|
from utils.constants import JWT_SECRET, JWT_ALGORITHM, JWT_EXPIRE_MINUTES
|
|
|
|
def create_jwt_token(data: dict):
|
|
# Create a copy of the data and handle Enum and datetime serialization
|
|
to_encode = {}
|
|
for key, value in data.items():
|
|
if isinstance(value, Enum):
|
|
to_encode[key] = value.value # Convert Enum to its string value
|
|
elif isinstance(value, datetime):
|
|
to_encode[key] = value.isoformat() # Convert datetime to ISO format string
|
|
else:
|
|
to_encode[key] = value
|
|
|
|
# Safely evaluate the JWT_EXPIRE_MINUTES expression
|
|
minutes = eval(JWT_EXPIRE_MINUTES) if isinstance(JWT_EXPIRE_MINUTES, str) else JWT_EXPIRE_MINUTES
|
|
expire = datetime.now(timezone.utc) + timedelta(minutes=minutes)
|
|
to_encode.update({"exp": expire.timestamp()}) # Use timestamp for expiration
|
|
encoded_jwt = jwt.encode(to_encode, JWT_SECRET, algorithm=JWT_ALGORITHM)
|
|
return encoded_jwt
|
|
|
|
|
|
def verify_jwt_token(token: str):
|
|
try:
|
|
payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
|
|
return payload
|
|
except jwt.ExpiredSignatureError:
|
|
return None
|
|
except jwt.InvalidTokenError:
|
|
return None
|