Easy_solution/docs/SSO_SLO_Documentation.md

4.7 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 {{ easycheck_url }}/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)

# 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'

Note : L'URL d'EasyCheck n'est plus stockée dans une variable d'environnement mais récupérée dynamiquement depuis la table oauth2_client en base de données.

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