# 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) ```bash # 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) ```bash # 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é 1. **CSRF désactivé sur logout** : Les routes de logout utilisent `enable_csrf: false` car ce sont des liens GET simples 2. **Tokens révoqués** : Lors du logout, tous les access_token de l'utilisateur sont révoqués côté portail 3. **Sessions invalidées** : Les sessions PHP sont complètement détruites des deux côtés 4. **Cookies supprimés** : Les cookies de session sont explicitement supprimés