veilletech.fr
29 sept. Feed du jour
#03 SYMFONY Article

Symfony 8.2 : le login OpenID Connect sans bundle

Le bouton « Se connecter avec… » n'a plus besoin de dépendance.

Symfony 8.2 ajoute oidc_login, un authenticator natif qui implémente tout le flux Authorization Code d'OpenID Connect : plus besoin de bundle tiers pour un bouton « Se connecter avec… ». Les vérifications sensibles sont actives par défaut (state, nonce, PKCE, signature JWKS, claims), le renouvellement des jetons et la déconnexion chez le fournisseur sont prévus. Attention : sans option, la déconnexion reste locale.

3 min de lectureintermédiairevidéo 1:33
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Comment ça marche
  3. Ce qui est vérifié sans rien écrire
  4. Les réglages utiles
  5. Le piège
  6. À retenir

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

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.