[PLANETEST] feat(sso-zelian): auto-login SSO + front-channel logout (v0.2.0) - #102
Merged
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.apps/web/core/components/account/auth-forms/auth-root.tsx(fichier core AGPL). Risque de conflit aux merges upstream sur ce fichier — à surveiller.?sso=0(formulaire classique, pour l'admin) et présence d'unerror_code(anti-boucle si le SSO échoue).2. Front-channel logout
ZelianLogoutEndpoint— route GET/auth/zelian/logout/qui ferme la session Django et redirige versZELIAN_POST_LOGOUT_REDIRECT_URL.?next,redirect_uri,post_logout_redirect_uri,//hostignorés) → anti open-redirect. Idempotent..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_ERROR5124 → 5910 ;5124désormais possédé par l'upstream commeOAUTH_PROVIDER_UNVERIFIED_EMAIL), cherry-piqué depuisfix/sso-zelian-error-code-doc-desync.🤖 Generated with Claude Code