diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d21e9f..c4994ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog - FlowDeck +## v7.74.0 (2026-10-21) — Fusion ACC-3.2 : validation locale draco_session et pont de session + +### Added + +- **Pont SSO `GET /auth/draco`** (Fusion ACC-3.2, issue #21) : le + cookie `draco_session` émis par ObsiGate (ACC-3.1) est vérifié + localement (`app/services/draco.py` — JWS HS256 au secret partagé + `DRACO_SESSION_SECRET`, révocation de l'émettrice en cache 60 s) + puis converti en session Flowdeck native. +- **Correspondance `sub` → compte local** : migration **51** + (`draco_links`, association 1:1) — lien créé automatiquement à la + première visite où la session native et un cookie draco valide + coexistent ; repli mono-utilisateur sans lien ; + `GET/POST/DELETE /auth/draco-link` pour consulter, ré-associer et + dissocier (pierre tombale anti re-création automatique). +- Bouton « Login with ObsiGate (SSO) » sur la page de connexion + (via `GET /sso/authorize` de l'émettrice, retour sur `/auth/draco`). +- Inerte tant que `DRACO_SESSION_SECRET` n'est pas configuré. + Tests : `tests/test_fusion_draco.py`. + ## v7.73.0 (2026-10-20) — Fusion ACC-2.1 : connecteur MCP Flowdeck → TikTak ### Added diff --git a/VERSION b/VERSION index 55ba97f..c08d15d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.73.0 +7.74.0 diff --git a/app/main.py b/app/main.py index 6332b3a..95299cb 100644 --- a/app/main.py +++ b/app/main.py @@ -192,7 +192,7 @@ async def lifespan(_app: FastAPI): app = FastAPI( title="FlowDeck", - version="7.73.0", + version="7.74.0", docs_url="/docs", redoc_url="/redoc", lifespan=lifespan, diff --git a/app/migrations.py b/app/migrations.py index b7080d3..a7ba1f8 100644 --- a/app/migrations.py +++ b/app/migrations.py @@ -2059,3 +2059,20 @@ def _migration_external_refs(conn: sqlite3.Connection) -> None: "CREATE INDEX IF NOT EXISTS idx_external_refs_owner " "ON external_refs(owner_type, owner_id)" ) + + +@register(51, "fusion: liens d'identité draco_links (ACC-3.2)") +def _migration_draco_links(conn: sqlite3.Connection) -> None: + """Migration 51 — correspondance sub (cookie SSO draco_session, + émis par ObsiGate) → compte Flowdeck local. Association 1:1 ; + `unlinked_at` sert de pierre tombale après dissociation.""" + conn.execute( + """ + CREATE TABLE IF NOT EXISTS draco_links ( + sub TEXT PRIMARY KEY, + user_id INTEGER NOT NULL UNIQUE REFERENCES users(id), + created_at TEXT NOT NULL DEFAULT (datetime('now')), + unlinked_at TEXT + ) + """ + ) diff --git a/app/routers/auth.py b/app/routers/auth.py index 1203c0e..d9755e6 100644 --- a/app/routers/auth.py +++ b/app/routers/auth.py @@ -102,7 +102,8 @@ body{background:#191919;color:#fff;font-family:-apple-system,BlinkMacSystemFont,

Or continue with

- + +