import os import typing from datetime import datetime from datetime import timedelta from datetime import timezone import jwt from starlette.datastructures import Headers import api.models as models if typing.TYPE_CHECKING: UserTokenData = dict[str, typing.Any] JWT_SECRET = os.getenv("JWT_SECRET", "") def encode_user_token( user: models.User, 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