BUG-122 — Point d'entrée navigable de la déconnexion globale
Carte fusion #141 (signalement de Bruno, 2026-11-06 : « Déconnexion » du menu compte inerte depuis la console Spark).
Constat
La barre commune relaie l'action deconnexion à l'hôte ; aucun hôte ne la branchait (console, ObsiGate, Flowdeck, TikTak, ShaarIt, Hub — Kanbante ne détruisait que sa session locale). Et la déconnexion globale d'ObsiGate (ACC-3.1, #216) n'était de toute façon pas atteignable par les sœurs : POST /api/auth/logout n'est appelable qu'en same-origin depuis l'interface d'ObsiGate.
Cette PR (côté émettrice)
GET /sso/logout?return_to= (backend/routers/sso.py), symétrique de /sso/authorize : exécute la déconnexion globale puis redirige (302) vers le return_to validé par la liste blanche existante (validate_return_to : https + *.dracodev.net, repli « / »). Idempotente sans session.
Logique partagée : le corps de POST /api/auth/logout est extrait dans apply_global_logout(request, response) (backend/auth/router.py) — les deux entrées terminent exactement la même session : jetons natifs refresh/access révoqués, jti draco révoqué, cookie draco_session effacé sur le domaine parent.
Docs (workflow du dépôt) : registre docs/ISSUES_TODOLIST.md (BUG-122 + journal ; BUG-121 laissé réservé au bug de couleur « Secrets » proposé), fiche docs/features/deconnexion-globale-bug-122.md, CHANGELOG [2.86.0], bump 2.85.1 → 2.86.0 via scripts/bump_version.py --minor --changelog (VERSION + dérivés synchronisés).
Tests
tests/test_draco_session.py : 34 passés (+3 : révocation du jti + redirection + cookie effacé, liste blanche, idempotence).
Périmètre voisin : test_version.py + test_comptes_machine.py verts (105 passés au total sur les trois fichiers).
ruff et mypy : 0 erreur sur les fichiers touchés.
Suite complète lancée en local ; le seul échec relevé à ce stade (test_agent_loop) est reproduit à l'identique sur l'arbre vierge (fonds préexistant, sans rapport).
Suite
Les hôtes branchent leur action deconnexion sur cette route (PR sœurs : console 0.75.7, Flowdeck, TikTak, Kanbante, ShaarIt ; Hub en direct sur main). Aucune fusion sans l'ordre de Bruno. Redéploiement Docker requis après fusion + release.
## BUG-122 — Point d'entrée navigable de la déconnexion globale
Carte fusion **#141** (signalement de Bruno, 2026-11-06 : « Déconnexion » du menu compte inerte depuis la console Spark).
### Constat
La barre commune relaie l'action `deconnexion` à l'hôte ; aucun hôte ne la branchait (console, ObsiGate, Flowdeck, TikTak, ShaarIt, Hub — Kanbante ne détruisait que sa session locale). Et la déconnexion globale d'ObsiGate (ACC-3.1, #216) n'était de toute façon pas atteignable par les sœurs : `POST /api/auth/logout` n'est appelable qu'en same-origin depuis l'interface d'ObsiGate.
### Cette PR (côté émettrice)
- **`GET /sso/logout?return_to=`** (`backend/routers/sso.py`), symétrique de `/sso/authorize` : exécute la déconnexion globale puis redirige (302) vers le `return_to` validé par la liste blanche existante (`validate_return_to` : https + `*.dracodev.net`, repli « / »). Idempotente sans session.
- **Logique partagée** : le corps de `POST /api/auth/logout` est extrait dans `apply_global_logout(request, response)` (`backend/auth/router.py`) — les deux entrées terminent exactement la même session : jetons natifs refresh/access révoqués, `jti` draco révoqué, cookie `draco_session` effacé sur le domaine parent.
- **Docs (workflow du dépôt)** : registre `docs/ISSUES_TODOLIST.md` (BUG-122 + journal ; BUG-121 laissé réservé au bug de couleur « Secrets » proposé), fiche `docs/features/deconnexion-globale-bug-122.md`, CHANGELOG [2.86.0], bump 2.85.1 → **2.86.0** via `scripts/bump_version.py --minor --changelog` (VERSION + dérivés synchronisés).
### Tests
- `tests/test_draco_session.py` : **34 passés** (+3 : révocation du jti + redirection + cookie effacé, liste blanche, idempotence).
- Périmètre voisin : `test_version.py` + `test_comptes_machine.py` verts (105 passés au total sur les trois fichiers).
- `ruff` et `mypy` : 0 erreur sur les fichiers touchés.
- Suite complète lancée en local ; le seul échec relevé à ce stade (`test_agent_loop`) est **reproduit à l'identique sur l'arbre vierge** (fonds préexistant, sans rapport).
### Suite
Les hôtes branchent leur action `deconnexion` sur cette route (PR sœurs : console 0.75.7, Flowdeck, TikTak, Kanbante, ShaarIt ; Hub en direct sur main). **Aucune fusion sans l'ordre de Bruno.** Redéploiement Docker requis après fusion + release.
Suite complète comparée (mise à jour) : branche 1932 passés / 42 échecs contre arbre vierge 1928 passés / 43 échecs dans le même environnement — la liste des échecs est identique (fonds historique de 42) ; l'écart d'un échec côté vierge est un artefact de la copie de comparaison (test_desktop_files_match, le répertoire desktop/ exclu de cette copie). La branche ajoute 4 tests, tous verts (3 × /sso/logout, 1 × branchement de la barre d'ObsiGate, second commit).
Preuve de rendu réel (pile locale ObsiGate 2.86.0 + console 0.75.7) : voir la carte fusion #141.
**Suite complète comparée (mise à jour)** : branche **1932 passés / 42 échecs** contre arbre vierge **1928 passés / 43 échecs** dans le même environnement — la liste des échecs est **identique** (fonds historique de 42) ; l'écart d'un échec côté vierge est un artefact de la copie de comparaison (`test_desktop_files_match`, le répertoire `desktop/` exclu de cette copie). La branche ajoute 4 tests, tous verts (3 × `/sso/logout`, 1 × branchement de la barre d'ObsiGate, second commit).
Preuve de rendu réel (pile locale ObsiGate 2.86.0 + console 0.75.7) : voir la carte fusion #141.
bruno
merged commit 854ff0f904 into main2026-11-06 14:26:44 -05:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
BUG-122 — Point d'entrée navigable de la déconnexion globale
Carte fusion #141 (signalement de Bruno, 2026-11-06 : « Déconnexion » du menu compte inerte depuis la console Spark).
Constat
La barre commune relaie l'action
deconnexionà l'hôte ; aucun hôte ne la branchait (console, ObsiGate, Flowdeck, TikTak, ShaarIt, Hub — Kanbante ne détruisait que sa session locale). Et la déconnexion globale d'ObsiGate (ACC-3.1, #216) n'était de toute façon pas atteignable par les sœurs :POST /api/auth/logoutn'est appelable qu'en same-origin depuis l'interface d'ObsiGate.Cette PR (côté émettrice)
GET /sso/logout?return_to=(backend/routers/sso.py), symétrique de/sso/authorize: exécute la déconnexion globale puis redirige (302) vers lereturn_tovalidé par la liste blanche existante (validate_return_to: https +*.dracodev.net, repli « / »). Idempotente sans session.POST /api/auth/logoutest extrait dansapply_global_logout(request, response)(backend/auth/router.py) — les deux entrées terminent exactement la même session : jetons natifs refresh/access révoqués,jtidraco révoqué, cookiedraco_sessioneffacé sur le domaine parent.docs/ISSUES_TODOLIST.md(BUG-122 + journal ; BUG-121 laissé réservé au bug de couleur « Secrets » proposé), fichedocs/features/deconnexion-globale-bug-122.md, CHANGELOG [2.86.0], bump 2.85.1 → 2.86.0 viascripts/bump_version.py --minor --changelog(VERSION + dérivés synchronisés).Tests
tests/test_draco_session.py: 34 passés (+3 : révocation du jti + redirection + cookie effacé, liste blanche, idempotence).test_version.py+test_comptes_machine.pyverts (105 passés au total sur les trois fichiers).ruffetmypy: 0 erreur sur les fichiers touchés.test_agent_loop) est reproduit à l'identique sur l'arbre vierge (fonds préexistant, sans rapport).Suite
Les hôtes branchent leur action
deconnexionsur cette route (PR sœurs : console 0.75.7, Flowdeck, TikTak, Kanbante, ShaarIt ; Hub en direct sur main). Aucune fusion sans l'ordre de Bruno. Redéploiement Docker requis après fusion + release.Suite complète comparée (mise à jour) : branche 1932 passés / 42 échecs contre arbre vierge 1928 passés / 43 échecs dans le même environnement — la liste des échecs est identique (fonds historique de 42) ; l'écart d'un échec côté vierge est un artefact de la copie de comparaison (
test_desktop_files_match, le répertoiredesktop/exclu de cette copie). La branche ajoute 4 tests, tous verts (3 ×/sso/logout, 1 × branchement de la barre d'ObsiGate, second commit).Preuve de rendu réel (pile locale ObsiGate 2.86.0 + console 0.75.7) : voir la carte fusion #141.