import os import typing from datetime import datetime from datetime import timedelta from datetime import timezone import jwt from fastapi import Request from starlette.datastructures import Headers from api.models import UserModel if typing.TYPE_CHECKING: UserTokenData = dict[str, typing.Any] JWT_SECRET = os.getenv("JWT_SECRET", "") def encode_user_token( user: UserModel, expire_in: timedelta = timedelta(hours=6) ) -> str: payload = {} payload["id"] = user.id payload["exp"] = datetime.now(tz=timezone.utc) + expire_in return jwt.encode(payload, JWT_SECRET) def decode_user_token(token: str) -> "UserTokenData": return jwt.decode(token, JWT_SECRET, ["HS256"]) def token_from_headers(headers: Headers) -> tuple[str, str]: auth_header: str = headers.get("authorization", "") scheme, _, auth_token = auth_header.partition(" ") return scheme, auth_token