auth : un utilisateur change son propre mot de passe (#21) #210

Merged
gabriel merged 3 commits from marvin/21-changer-mot-de-passe into develop 2026-09-08 14:49:27 +00:00
Member

Ce que la PR fait

La page de profil (#21) etait un stub : identite de l'appelant, rien de plus,
alors que le critere d'acceptation du ticket est le changement de mot de passe.
Aucun endpoint d'auto-service n'existait — seul PATCH /auth/users/{id},
reserve aux admins et sans verification du mot de passe actuel.

API — POST /auth/me/password

Authentifie, {current_password, new_password}.

  • Verifie le mot de passe actuel : un jeton d'acces vole ne suffit pas a
    verrouiller le compte.
  • Remplace le hash, coupe toutes les sessions de l'utilisateur, puis reemet
    une session pour l'appelant — ses cookies ev_access / ev_refresh
    remplacent les anciens. L'onglet courant reste connecte, les autres appareils
    sont deconnectes.
  • 403 si l'actuel est faux, 422 si le nouveau est < 8 caracteres ou
    identique a l'actuel. Journalise password_changed / password_change_ko.
  • Aucune nouvelle fonction repository : revoke_user_sessions existait deja.

Dashboard

  • changerMotDePasse() dans la couche d'appel, aux noms du contrat.
  • MotDePasseFormulaire, monte sur la page de profil : actuel + nouveau +
    confirmation. Confirmation, longueur et « different de l'actuel » verifies
    cote client. Succes : champs vides, « vos autres appareils ont ete
    deconnectes » (role=status) ; erreurs via AlerteFormulaire (role=alert).

Docs

docs/api/authentification.md (endpoint, codes) et docs/api/decisions.md
(l'auto-service partiel remplace « pas d'auto-service »).

Verification

  • pytest tests/unit/api/ : 224 passent (11 nouveaux) ; ruff + mypy clean.
  • npm run test:unit (dashboard) : 383 passent (10 nouveaux) ; npm run build ok.

Limite connue

Pas de limite de debit sur les tentatives de mot de passe actuel : l'attaquant
aurait deja une session valide, et les echecs sont audites.

## Ce que la PR fait La page de profil (#21) etait un stub : identite de l'appelant, rien de plus, alors que le critere d'acceptation du ticket est le changement de mot de passe. Aucun endpoint d'auto-service n'existait — seul `PATCH /auth/users/{id}`, reserve aux admins et sans verification du mot de passe actuel. ### API — `POST /auth/me/password` Authentifie, `{current_password, new_password}`. - Verifie le **mot de passe actuel** : un jeton d'acces vole ne suffit pas a verrouiller le compte. - Remplace le hash, **coupe toutes les sessions** de l'utilisateur, puis reemet une session pour l'appelant — ses cookies `ev_access` / `ev_refresh` remplacent les anciens. L'onglet courant reste connecte, les autres appareils sont deconnectes. - `403` si l'actuel est faux, `422` si le nouveau est < 8 caracteres ou identique a l'actuel. Journalise `password_changed` / `password_change_ko`. - Aucune nouvelle fonction `repository` : `revoke_user_sessions` existait deja. ### Dashboard - `changerMotDePasse()` dans la couche d'appel, aux noms du contrat. - `MotDePasseFormulaire`, monte sur la page de profil : actuel + nouveau + confirmation. Confirmation, longueur et « different de l'actuel » verifies cote client. Succes : champs vides, « vos autres appareils ont ete deconnectes » (`role=status`) ; erreurs via `AlerteFormulaire` (`role=alert`). ### Docs `docs/api/authentification.md` (endpoint, codes) et `docs/api/decisions.md` (l'auto-service partiel remplace « pas d'auto-service »). ## Verification - `pytest tests/unit/api/` : 224 passent (11 nouveaux) ; `ruff` + `mypy` clean. - `npm run test:unit` (dashboard) : 383 passent (10 nouveaux) ; `npm run build` ok. ## Limite connue Pas de limite de debit sur les tentatives de mot de passe actuel : l'attaquant aurait deja une session valide, et les echecs sont audites.
auth : un utilisateur change son propre mot de passe (#21)
All checks were successful
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 41s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 6s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Infra Ansible / Playbooks Ansible valides (pull_request) Successful in 1m28s
Intégration / Python — qualité, tests et dépendances (pull_request) Successful in 5m34s
a38bceea24
La page de profil était un stub : elle affichait l'identité et rien de
plus, alors que le critère d'acceptation du ticket est le changement de
mot de passe. Aucun endpoint d'auto-service n'existait — seul
`PATCH /auth/users/{id}`, réservé aux admins et sans vérification du
mot de passe actuel.

API — `POST /auth/me/password` (`{current_password, new_password}`,
authentifié) : vérifie le mot de passe actuel (un jeton d'accès volé ne
suffit pas), le remplace, coupe toutes les sessions de l'utilisateur,
puis réémet une session pour l'appelant — ses cookies remplacent les
anciens dans la réponse. 403 si l'actuel est faux, 422 si le nouveau
est trop court ou identique. Journalisé : `password_changed` /
`password_change_ko`.

Dashboard — `MotDePasseFormulaire`, monté sur la page de profil :
actuel + nouveau + confirmation, la confirmation vérifiée côté client.
Succès : champs vidés, « vos autres appareils ont été déconnectés ».

Docs d'auth mises à jour (endpoints, codes, décisions).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EL8Yw5fQMitWWyKR4FugX3
marvin requested review from gabriel 2026-09-08 14:35:46 +00:00
marvin self-assigned this 2026-09-08 14:35:56 +00:00
gabriel approved these changes 2026-09-08 14:45:03 +00:00
Dismissed
gabriel left a comment

Approuvé. Quelques remarques mineures, non bloquantes :

  • services/dashboard/src/components/MotDePasseFormulaire.vue:75 : tout 422 de POST /auth/me/password est affiché comme "le nouveau mot de passe doit différer de l'actuel", alors que l'API renvoie aussi 422 pour d'autres erreurs de validation (ex. longueur > max_length côté Pydantic) — message potentiellement trompeur dans ces cas.
  • services/dashboard/src/api/authentification.js:121 : changerMotDePasse() rejette toujours en 403 en mode démo, ce qui affiche "mot de passe actuel incorrect" même si aucune vérification n'a réellement eu lieu — trompeur pour un compte de démo.
  • services/api/enervision_api/auth/service.py:148 : change_own_password() refait un SELECT sur ops.users alors que get_current_user avait déjà récupéré la même ligne (avec password_hash) plus tôt dans la requête — requête dupliquée, pas bloquant.
Approuvé. Quelques remarques mineures, non bloquantes : - `services/dashboard/src/components/MotDePasseFormulaire.vue:75` : tout 422 de `POST /auth/me/password` est affiché comme "le nouveau mot de passe doit différer de l'actuel", alors que l'API renvoie aussi 422 pour d'autres erreurs de validation (ex. longueur > max_length côté Pydantic) — message potentiellement trompeur dans ces cas. - `services/dashboard/src/api/authentification.js:121` : `changerMotDePasse()` rejette toujours en 403 en mode démo, ce qui affiche "mot de passe actuel incorrect" même si aucune vérification n'a réellement eu lieu — trompeur pour un compte de démo. - `services/api/enervision_api/auth/service.py:148` : `change_own_password()` refait un SELECT sur `ops.users` alors que `get_current_user` avait déjà récupéré la même ligne (avec `password_hash`) plus tôt dans la requête — requête dupliquée, pas bloquant.
gabriel approved these changes 2026-09-08 14:46:43 +00:00
Dismissed
Merge branch 'develop' into marvin/21-changer-mot-de-passe
Some checks failed
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Successful in 41s
Intégration / Contrôles statiques du dépôt (pull_request) Successful in 6s
Intégration / Workflows — lint et audit de sécurité (pull_request) Successful in 18s
Intégration / Python — qualité, tests et dépendances (pull_request) Has been cancelled
2bf4231e2b
gabriel dismissed gabriel's review 2026-09-08 14:47:09 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

Merge branch 'develop' into marvin/21-changer-mot-de-passe
Some checks failed
Intégration / Python — qualité, tests et dépendances (pull_request) Has been cancelled
Intégration / Tableau de bord — dépendances, tests et construction (pull_request) Has been cancelled
Intégration / Contrôles statiques du dépôt (pull_request) Has been cancelled
Intégration / Workflows — lint et audit de sécurité (pull_request) Has been cancelled
4d4dd273c3
gabriel merged commit a9af37ed7c into develop 2026-09-08 14:49:27 +00:00
gabriel deleted branch marvin/21-changer-mot-de-passe 2026-09-08 14:49:27 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision!210
No description provided.