52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from dataclasses import dataclass
|
||
|
|
from typing import Final
|
||
|
|
|
||
|
|
from fastapi import Request, Response
|
||
|
|
|
||
|
|
from app.core.config import settings
|
||
|
|
|
||
|
|
|
||
|
|
COOKIE_PATH: Final[str] = "/"
|
||
|
|
|
||
|
|
|
||
|
|
@dataclass(frozen=True)
|
||
|
|
class AuthCookie:
|
||
|
|
name: str
|
||
|
|
|
||
|
|
def apply(self, response: Response, token: str) -> None:
|
||
|
|
response.set_cookie(
|
||
|
|
key=self.name,
|
||
|
|
value=token,
|
||
|
|
httponly=True,
|
||
|
|
secure=settings.session_cookie_secure,
|
||
|
|
samesite=settings.session_cookie_samesite,
|
||
|
|
domain=settings.session_cookie_domain,
|
||
|
|
path=COOKIE_PATH,
|
||
|
|
max_age=settings.session_ttl_seconds,
|
||
|
|
)
|
||
|
|
|
||
|
|
def clear(self, response: Response) -> None:
|
||
|
|
response.delete_cookie(
|
||
|
|
key=self.name,
|
||
|
|
domain=settings.session_cookie_domain,
|
||
|
|
path=COOKIE_PATH,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
CLIENT_AUTH_COOKIE = AuthCookie(settings.session_cookie_name)
|
||
|
|
ADMIN_AUTH_COOKIE = AuthCookie(settings.admin_session_cookie_name)
|
||
|
|
|
||
|
|
|
||
|
|
def get_bearer_or_cookie_token(request: Request, *, cookie_name: str) -> str | None:
|
||
|
|
authorization = request.headers.get("authorization", "").strip()
|
||
|
|
if authorization.lower().startswith("bearer "):
|
||
|
|
token = authorization[7:].strip()
|
||
|
|
if token:
|
||
|
|
return token
|
||
|
|
cookie_value = request.cookies.get(cookie_name)
|
||
|
|
if cookie_value:
|
||
|
|
return cookie_value
|
||
|
|
return None
|