diff --git a/docs/SSO_SLO_Documentation.md b/docs/SSO_SLO_Documentation.md new file mode 100644 index 0000000..9468805 --- /dev/null +++ b/docs/SSO_SLO_Documentation.md @@ -0,0 +1,153 @@ +# 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 \ No newline at end of file