36 lines
905 B
Python
36 lines
905 B
Python
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
|