Étape 8 : connexion par mot de passe pour la coordination
Deux systèmes d'authentification, une même session JWT :
- COORDINATION : login e-mail + mot de passe (bcrypt), POST .../auth/login ;
POST .../auth/change-password pour le compte courant
- RÉFÉRENTS / BÉNÉVOLES : lien magique inchangé, mais refusé pour un compte
qui a un mot de passe
- Account.password_hash (nullable) + migration 0002 ; propriété auth_method
("password" / "magic_link") exposée dans AccountRead
- app/auth/passwords.py : hash/verify bcrypt, longueur mini 10
- Création de compte : password requis pour COORDINATOR, interdit sinon
- seed : la coordination de démo a un mot de passe, affiché dans le résumé
- 12 tests (login ok/ko, séparation des deux systèmes, change-password,
validation à la création) ; 129 tests au total ; alembic check vert
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
1f9f460540
commit
8a879ca5c3
@@ -85,13 +85,20 @@ def make_account(session, edition):
|
||||
counter = itertools.count()
|
||||
|
||||
def _make(
|
||||
role: Role, *, volunteer_id=None, email: str | None = None
|
||||
role: Role,
|
||||
*,
|
||||
volunteer_id=None,
|
||||
email: str | None = None,
|
||||
password: str | None = None,
|
||||
) -> Account:
|
||||
from app.auth.passwords import hash_password
|
||||
|
||||
account = Account(
|
||||
edition_id=edition.id,
|
||||
role=role,
|
||||
email=email or f"{role.value.lower()}{next(counter)}@test",
|
||||
volunteer_id=volunteer_id,
|
||||
password_hash=hash_password(password) if password else None,
|
||||
)
|
||||
session.add(account)
|
||||
session.commit()
|
||||
|
||||
Reference in New Issue
Block a user