4.6 KiB
4.6 KiB
Documentation SSO/SLO - EasyPortal & EasyCheck
Vue d'ensemble
Cette documentation décrit l'implémentation du Single Sign-On (SSO) et du Single Logout (SLO) entre deux applications Symfony :
- EasyPortal : Serveur d'autorisation OAuth2 (Identity Provider)
- EasyCheck : Application cliente OAuth2
Architecture
┌─────────────────┐ ┌─────────────────┐
│ EasyPortal │ │ EasyCheck │
│ (OAuth2 Server)│◄──────────────────►│ (OAuth2 Client) │
│ │ │ │
│ - Authentifie │ │ - Utilise le │
│ - Émet tokens │ │ token OAuth2 │
│ - Révoque │ │ - Valide token │
└─────────────────┘ └─────────────────┘
Single Sign-On (SSO)
Principe
L'utilisateur s'authentifie une seule fois sur le portail et accède ensuite à toutes les applications sans re-saisir ses identifiants.
Flux d'authentification
1. Utilisateur → EasyCheck
└─> Pas de session active
2. EasyCheck → Redirection vers EasyPortal
└─> /authorize?client_id=...&redirect_uri=...
3. Utilisateur → Connexion sur EasyPortal
└─> Login/Password ou session existante
4. EasyPortal → Redirection vers EasyCheck
└─> /sso_check?code=AUTHORIZATION_CODE
5. EasyCheck → Échange du code contre un token
└─> POST /token avec authorization_code
└─> Reçoit access_token + refresh_token
6. EasyCheck → Création de session locale
└─> Stockage du token en session
└─> Utilisateur connecté
Single Logout (SLO)
Principe
Lorsqu'un utilisateur se déconnecte d'une application, il est automatiquement déconnecté de toutes les applications SSO.
Flux de déconnexion depuis EasyCheck
1. Utilisateur → Clic "Déconnexion" sur EasyCheck
└─> GET /logout
2. Symfony → Invalide la session EasyCheck
└─> Session détruite, cookies supprimés
3. LogoutSubscriber → Interception de l'événement
└─> Redirection vers EasyPortal
4. EasyCheck → Redirection
└─> GET https://portail.../sso_logout?from_easycheck=1
5. EasyPortal → Révocation des tokens OAuth2
└─> Tous les access_token de l'utilisateur sont révoqués
6. EasyPortal → Redirection vers /logout
└─> GET /logout
7. Symfony → Invalide la session EasyPortal
└─> Session détruite
8. EasyPortal → Redirection finale
└─> GET /login
Flux de déconnexion depuis EasyPortal
1. Utilisateur → Clic "Déconnexion" sur EasyPortal
└─> GET /sso_logout
2. EasyPortal → Révocation des tokens OAuth2
└─> Tous les access_token de l'utilisateur sont révoqués
3. EasyPortal → Redirection vers /logout
└─> GET /logout
4. Symfony → Invalide la session EasyPortal
└─> Session détruite
5. LogoutSubscriber → Interception de l'événement
└─> Redirection vers EasyCheck
6. EasyPortal → Redirection
└─> GET https://check.../logout
7. EasyCheck → Invalide la session
└─> Session détruite, cookies supprimés
8. EasyCheck → Redirection vers EasyPortal
└─> GET https://portail.../sso_logout?from_easycheck=1
9. EasyPortal → Détecte from_easycheck=1
└─> Redirection directe vers /logout (déjà fait)
10. EasyPortal → Redirection finale
└─> GET /login
Variables d'environnement
EasyCheck (.env)
# URL du serveur SSO (EasyPortal)
SSO_URL='https://portail.solutions-easy.moi'
# Configuration OAuth2
OAUTH_CLIENT_ID='easycheck-client-id'
OAUTH_CLIENT_SECRET='secret-key'
EasyPortal (.env)
# URL de l'application cliente (EasyCheck)
EASYCHECK_URL='https://check.solutions-easy.moi'
# Configuration OAuth2 Server
OAUTH_PRIVATE_KEY=%kernel.project_dir%/config/jwt/private.key
OAUTH_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.key
OAUTH_PASSPHRASE='passphrase'
OAUTH_ENCRYPTION_KEY='encryption-key'
Points importants
Sécurité
- CSRF désactivé sur logout : Les routes de logout utilisent
enable_csrf: falsecar ce sont des liens GET simples - Tokens révoqués : Lors du logout, tous les access_token de l'utilisateur sont révoqués côté portail
- Sessions invalidées : Les sessions PHP sont complètement détruites des deux côtés
- Cookies supprimés : Les cookies de session sont explicitement supprimés