Skip to content

[PLANETEST] feat(sso-zelian): auto-login SSO + front-channel logout (v0.2.0) - #102

Merged
userLinpy merged 5 commits into
previewfrom
feat/sso-zelian-auto-login-et-logout
Jul 21, 2026
Merged

[PLANETEST] feat(sso-zelian): auto-login SSO + front-channel logout (v0.2.0)#102
userLinpy merged 5 commits into
previewfrom
feat/sso-zelian-auto-login-et-logout

Conversation

@userLinpy

Copy link
Copy Markdown
Owner

Résumé (v0.2.0)

Deux compléments au flux SSO Zelian, livrés après validation E2E complète (2026-07-20).

1. Auto-login SSO

Quand IS_ZELIAN_ENABLED=1, la page de connexion redirige automatiquement vers /auth/zelian/ sans clic utilisateur.

  • ⚠️ Premier écart au principe « seams front uniquement » : modifie apps/web/core/components/account/auth-forms/auth-root.tsx (fichier core AGPL). Risque de conflit aux merges upstream sur ce fichier — à surveiller.
  • Garde-fous : ?sso=0 (formulaire classique, pour l'admin) et présence d'un error_code (anti-boucle si le SSO échoue).

2. Front-channel logout

ZelianLogoutEndpoint — route GET /auth/zelian/logout/ qui ferme la session Django et redirige vers ZELIAN_POST_LOGOUT_REDIRECT_URL.

  • Destination prise uniquement dans la config serveur — jamais dans un paramètre de requête (?next, redirect_uri, post_logout_redirect_uri, //host ignorés) → anti open-redirect. Idempotent.
  • Nouvelle variable .env.example : ZELIAN_POST_LOGOUT_REDIRECT_URL.

Tests

22 tests unitaires offline (15 provider + 7 logout — résistance aux redirections ouvertes). Validation E2E complète confirmée le 2026-07-20 (mire @zelian/auth).

Correctif doc inclus

Cette branche embarque aussi le resync des codes d'erreur (ZELIAN_OAUTH_PROVIDER_ERROR 5124 → 5910 ; 5124 désormais possédé par l'upstream comme OAUTH_PROVIDER_UNVERIFIED_EMAIL), cherry-piqué depuis fix/sso-zelian-error-code-doc-desync.

⚠️ Interaction de merge avec la PR #101 (qui porte ce même correctif isolément vers preview) : les deux PR contiennent le fix des codes d'erreur. Selon l'ordre de merge, un conflit trivial sur l'en-tête Version de spec-technique.md peut apparaître (0.1.2 côté #101 vs 0.2.0 ici) — à résoudre en gardant 0.2.0. Le reste (valeur 5910, ligne VERSIONNING 0.1.2) est identique des deux côtés et fusionne sans conflit.

🤖 Generated with Claude Code

userLinpy and others added 5 commits July 20, 2026 20:54
Deux evolutions du module api/sso-zelian, apres validation E2E du SSO.

1. Auto-login sans clic (auth-root.tsx)

La mire Zelian etant le point d'entree unique de l'ecosysteme, faire
cliquer « Continue with Zelian » n'apporte rien : on y redirige
directement. Deux garde-fous, poses par le tech-design du module :
  - `?sso=0` laisse le formulaire classique accessible. Sans cette
    echappatoire, un admin d'instance ne pourrait plus se connecter en
    e-mail/mot de passe si le SSO tombait.
  - un `error_code` present bloque la redirection : l'erreur vient du SSO,
    y retourner boucherait a l'infini sans jamais l'afficher.

L'URL est construite avec API_BASE_URL, comme le bouton existant : la route
est servie par Django (8000), pas par le front (3000). Un chemin relatif
tombe sur le routeur front, qui repond 200 avec sa page « not found » —
echec silencieux.

**Ecart assume** : ce fichier est du core AGPL, alors que la decision 2 du
tech-design posait « seams front uniquement, zero modif de fichier core ».
Le follow-up etait prevu ainsi (decision 5). A surveiller aux merges
upstream, ou ce fichier deviendra une source de conflits.

2. Deconnexion globale (ZelianLogoutEndpoint + zelian_post_logout_url)

Plane tient sa propre session Django, independante de Supabase : fermer
l'une laissait l'autre ouverte. `/auth/sign-out/` n'y suffisait pas — il
n'accepte que POST, donc une redirection depuis la mire ne le declenche pas.

  - `/auth/zelian/logout/` : point d'entree GET, dans le role du
    `frontchannel_logout_uri` d'OIDC. La destination vient **uniquement** de
    la configuration serveur ; honorer un parametre de l'appelant ferait de
    cet endpoint une redirection ouverte. Idempotent sans session ouverte.
  - `zelian_post_logout_url()` : sous SSO, le sign-out renvoie a la mire et
    non a l'accueil de Plane. Y rester enfermait l'utilisateur — la page de
    connexion relancait l'auto-login, la session Supabase etant toujours
    valide, et le reconnectait aussitot. Hors SSO, la destination reste
    inchangee.

Risque assume et documente : un endpoint de deconnexion en GET est expose au
« logout CSRF ». La consequence se limite a une deconnexion subie, sans
acces ni perte de donnees ; c'est le compromis du front-channel logout OIDC.

Tests : 10 nouveaux (test_zelian_logout.py), centres sur le fait qu'aucun
parametre d'appelant ne detourne la redirection. 25 tests verts sur le
module. ruff clean, 3 routes resolues, typecheck web OK.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…lobale

Synchronisation produite par l'agent `update-writer-after-implement` du
framework Zelian, sur le module api/sso-zelian.

- spec-fonctionnel : l'auto-redirect sort du « Hors scope », il est livre.
  Corrige aussi une incoherence anterieure — le document portait encore
  « validation E2E bloquee » avec son critere decoche, alors que
  spec-technique indiquait « valide E2E le 2026-07-13 ».
- spec-technique / tech-design : nouveaux endpoints, variable
  ZELIAN_POST_LOGOUT_REDIRECT_URL, garde-fous de l'auto-login, et l'ecart
  assume sur auth-root.tsx (fichier core).
- CHANGELOG : entrees correspondantes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Depuis le fix sécurité ATO (d891e50, 2026-07-18), le code a déplacé
ZELIAN_OAUTH_PROVIDER_ERROR de 5124 vers 5910 : 5124 est désormais possédé
par l'upstream (OAUTH_PROVIDER_UNVERIFIED_EMAIL) et le bloc 59xx est réservé
au fork. La documentation n'avait jamais été resynchronisée.

- spec-technique.md (tableau « Fichiers modifiés ») : error.py = 5910, avec
  la note sur la réservation 59xx et la propriété upstream de 5124.
- CHANGELOG.md (entrée Added « api+web/sso-zelian ») : 5124 → 5910.
- VERSIONNING.md : ligne 0.1.2 (refactor) traçant la renumérotation.

Code de vérité : apps/api/plane/authentication/adapter/error.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 8a79e7a)
Une ligne vide séparait la rangée 0.2.0 du reste du tableau (héritée du
commit v0.2.0) : en markdown elle terminait le tableau, si bien que la
rangée 0.2.0 se rendait en texte brut au lieu d'une ligne de tableau.
Ligne vide retirée — la rangée rejoint le tableau, aucun contenu modifié.
Met feat à jour avec preview (qui a mergé #101 — resync des codes d'erreur —
plus d'autres correctifs auth). Rend #102 mergeable.

Conflit résolu en gardant la version de feat pour les 3 specs sso-zelian
(CHANGELOG.md, spec-technique.md, VERSIONNING.md) : c'est le sur-ensemble —
le fix ZELIAN_OAUTH_PROVIDER_ERROR 5124→5910 y est déjà (via cherry-pick) et
feat porte en plus tout le contenu v0.2.0 + l'en-tête 0.2.0.

Aucun fichier de code v0.2.0 modifié par le merge ; error.py conserve les
codes Zelian (5910/5124) et reçoit BOT_USER_LOGIN_FORBIDDEN=5017 de preview.
@userLinpy
userLinpy merged commit 595435f into preview Jul 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant