35 lines
874 B
Python

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