feat(backend): pose les primitives de sécurité

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.
This commit is contained in:
Johan LEROY
2026-09-15 14:25:41 +02:00
parent 008cf581a7
commit 53af7a76d8
9 changed files with 627 additions and 1 deletions
+5 -1
View File
@@ -13,6 +13,9 @@ dependencies = [
"alembic>=1.20.0",
"prometheus-fastapi-instrumentator>=8.1.0",
"python-json-logger>=4.2.0",
"pyjwt>=2.10",
"argon2-cffi>=23.1",
"anyio>=4.0",
]
[dependency-groups]
@@ -57,7 +60,8 @@ select = [
ignore = ["B008"]
[tool.ruff.lint.per-file-ignores]
"tests/**/*.py" = ["S101"]
# S105 et S106 signalent les secrets en dur, ce qui est justement la matière des tests d'auth.
"tests/**/*.py" = ["S101", "S105", "S106"]
[tool.ruff.lint.isort]
known-first-party = ["app"]