ADR 004 — Migration passlib vers bcrypt direct
Contexte
Sprint 2 — Dette technique identifiée lors du Sprint 1. passlib 1.7.4 est abandonné depuis 2023. Incompatible avec bcrypt >= 4.0.0 car passlib accède a bcrypt.about.version supprime dans bcrypt 4.0.0.
Solution temporaire Sprint 1 : pin bcrypt<4.0.0 Solution definitive Sprint 2 : migration vers bcrypt direct
Probleme
passlib 1.7.4 + bcrypt >= 4.0.0 : AttributeError: module 'bcrypt' has no attribute 'about'
Consequence : les tests plantaient avec bcrypt >= 4.0.0 Workaround : bcrypt<4.0.0 dans requirements.in
Decision
Migrer de passlib vers bcrypt direct. Supprimer la contrainte de version bcrypt.
Changements
app/utils.py
AVANT : from passlib.context import CryptContext pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") return pwd_context.hash(password) return pwd_context.verify(plain_password, hashed_password)
APRES : import bcrypt password_bytes = password.encode("utf-8") salt = bcrypt.gensalt() hashed = bcrypt.hashpw(password_bytes, salt) return hashed.decode("utf-8")
return bcrypt.checkpw( plain_password.encode("utf-8"), hashed_password.encode("utf-8") )
requirements.in
AVANT : passlib bcrypt<4.0.0
APRES : bcrypt
Avantages
- bcrypt 5.0.0 supporte
- Moins de dependances (passlib supprime)
- Maintenance directe par la lib activement maintenue
- Plus de contrainte de version
- 34 tests passent, coverage 95%
Compatibilite hashes existants
Les hashes bcrypt generes par passlib sont compatibles avec bcrypt direct. Aucune migration de donnees necessaire. Les utilisateurs existants peuvent se connecter normalement.
References
- Ticket : #14 security: migrate passlib to bcrypt direct
- Date : 2026-05-10
- bcrypt version : 5.0.0
- python version : 3.10 (Dockerfile) / 3.12 (local)