Ce qui se passe
OpenID Connect est le protocole derrière la plupart des boutons « Se connecter avec… » : l'application confie l'authentification à un fournisseur d'identité, Keycloak, Authentik, Auth0, Okta ou Microsoft Entra ID.
Depuis Symfony 6.3, l'authenticator par jeton d'accès sait valider un jeton
OIDC qu'un client possède déjà : parfait pour une API, inutile pour connecter
une personne depuis son navigateur, qui demandait un bundle tiers. Symfony 8.2,
attendu en novembre, ajoute un authenticator natif, oidc_login, qui
implémente le flux Authorization Code en entier.
Comment ça marche
On installe le composant HttpClient et la bibliothèque de validation des ID
tokens, puis on active oidc_login dans le firewall. Pas d'URL à recopier :
Symfony lit les points d'accès du fournisseur dans son document
.well-known/openid-configuration.
Un visiteur anonyme qui ouvre une page protégée est redirigé chez le
fournisseur, revient sur /oidc/callback (valeur par défaut de check_path), et
l'authenticator ouvre la session. La recette Flex importe les routes ; pour une
page de connexion à plusieurs boutons, il suffit de pointer vers la route qui
démarre le flux.
Ce qui est vérifié sans rien écrire
stateetnonce: pas de CSRF à la connexion, et l'ID token est lié à la requête d'origine ;- PKCE par défaut : un code d'autorisation intercepté ne sert à rien ;
- signature de l'ID token contrôlée contre les clés publiées (JWKS), mises en cache, rotation absorbée sans intervention ;
- claims
iss,aud,exp,iat, et paramètreissde la réponse contre les attaques par confusion de fournisseur ; - HTTPS obligatoire pour tous les points d'accès (sauf boucle locale en développement), et aucune redirection HTTP suivie.
Les réglages utiles
| Besoin | Option ou point d'extension |
|---|---|
| Identifier par un autre claim | user_identifier_claim: email |
| Lire les claims dans l'ID token plutôt qu'à UserInfo | user_data_source: id_token |
| Paramètre fixe à l'autorisation | authorization_params (ex. prompt: consent) |
| Paramètre qui dépend de la requête | événement OidcAuthorizationRequestEvent |
| Authentification du client | client_authentication : client_secret_basic, client_secret_post, none, private_key_jwt, client_secret_jwt, ou ClientAuthenticationInterface |
| Déconnexion chez le fournisseur | enable_end_session |
| Authentification récente exigée | max_age |
| Réponse en POST | response_mode: form_post |
Le fournisseur d'utilisateurs intégré oidc crée les utilisateurs à la volée à
partir des claims. Pour les stocker en base ou convertir des groupes en rôles,
on écrit son propre fournisseur : loadUserByIdentifier() reçoit tous les
claims en second argument. Les jetons restent accessibles dans le jeton de
sécurité ($token->getAttribute('oidc_access_token')), et Symfony peut les
renouveler par refresh token juste avant expiration, ou à la demande via le
service OidcTokenRefresher et sa méthode refreshIfNeeded().
Le piège
Par défaut, la déconnexion ne ferme que la session de l'application.
L'utilisateur reste connecté chez le fournisseur, et sa prochaine visite d'une
page protégée le reconnecte sans rien lui demander. Sur un poste partagé, c'est
exactement ce qu'on ne veut pas : activer enable_end_session (RP-Initiated
Logout).
Source : New in Symfony 8.2: OpenID Connect Login, Symfony, 28 septembre 2026 ; contributions de Mathieu Santostefano, Yonel Ceruto et Florent Morselli. Référence complète : documentation OIDC login.