Couche pure, sans FastAPI ni session : rôles ordonnés, `Principal`, encodage et décodage des jetons d'accès, empreinte des jetons de rafraîchissement, et hachage Argon2id poussé dans un fil borné. Aucun de ces modules ne lit `get_settings()`, mis en cache par `lru_cache` et donc contaminé entre tests : les paramètres arrivent par `TokenPolicy` et par `build_hasher()`. Argon2id est calibré à m=19456 KiB, t=2, p=1, soit 17 ms mesurés sur un poste de développement.
19 lines
539 B
Python
19 lines
539 B
Python
# Pourquoi : tout le code métier dépend de `Principal` et jamais du modèle ORM ni des claims
|
|
# du jeton. C'est ce qui garde la bascule vers un fournisseur OIDC locale à
|
|
# `get_current_principal()` et à `AuthService.authenticate()`, au lieu de la répandre dans
|
|
# chaque endpoint.
|
|
|
|
from dataclasses import dataclass
|
|
from uuid import UUID
|
|
|
|
from app.core.roles import AccountKind, Role
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class Principal:
|
|
id: UUID
|
|
email: str
|
|
role: Role
|
|
kind: AccountKind
|
|
must_change_password: bool
|