Dans le paysage moderne de la sécurité des applications, comprendre comment authentifier les utilisateurs et autoriser l'accès aux ressources est primordial. Pour les développeurs, la distinction entre OAuth 2.0 et OpenID Connect (OIDC) n'est pas seulement académique ; elle est cruciale pour construire des applications sécurisées et évolutives. Bien qu'ils soient souvent utilisés de manière interchangeable, ces protocoles servent des objectifs distincts mais complémentaires. Cet article explore les nuances techniques des deux, leur intégration et les meilleures pratiques d'implémentation.
Les fondations : Le cadre d'autorisation OAuth 2.0
Il est essentiel de clarifier un malentendu courant : OAuth 2.0 est un cadre d'autorisation, et non un protocole d'authentification. Il traite de la délégation d'accès. Lorsqu'un utilisateur souhaite accorder à une application tierce l'accès à ses ressources sur un autre service (comme permettre à une application photo d'accéder à vos photos Instagram), OAuth 2.0 est le standard utilisé pour émettre des jetons d'accès.
L'entité centrale d'OAuth 2.0 est le Jeton d'accès (Access Token). Ce jeton représente les permissions accordées à l'application cliente. Crucialement, les jetons d'accès ne doivent jamais être utilisés pour identifier qui est l'utilisateur. Ce sont des chaînes opaques destinées uniquement à autoriser les requêtes API.
Considérons un scénario où une application mobile demande l'accès à la bibliothèque Spotify d'un utilisateur. Le serveur Spotify émet un jeton d'accès. L'application mobile envoie ce jeton dans l'en-tête Authorization lors des appels API :
GET /v1/me/tracks HTTP/1.1
Host: api.spotify.com
Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA
Cela garantit que l'application peut lire les pistes, mais ne prouve pas intrinsèquement l'identité de l'utilisateur au-delà de la possession d'un jeton valide.
Extension d'OAuth 2.0 : L'arrivée d'OpenID Connect
Si OAuth 2.0 répond à la question "Puis-je faire cela ?", OpenID Connect répond à "Qui êtes-vous ?". OIDC est une couche d'identité simple construite au-dessus du cadre OAuth 2.0. Il permet aux clients de vérifier l'identité de l'utilisateur final sur la base de l'authentification effectuée par un serveur d'autorisation, ainsi que d'obtenir des informations de profil de base sur l'utilisateur final de manière interopérable et semblable à REST.
L'ajout clé qu'apporte OIDC est le Jeton d'identité (ID Token). Il s'agit d'un jeton web JSON (JWT) qui contient des revendications (claims) concernant l'événement d'authentification. Contrairement au jeton d'accès opaque, le jeton d'identité est structuré et signé, permettant au client de décoder et de vérifier l'identité de l'utilisateur sans avoir besoin d'interroger un serveur backend.
Implémentation pratique : Le flux de code d'autorisation
Pour les applications web, le flux de code d'autorisation avec PKCE (Proof Key for Code Exchange) est l'approche recommandée. Ce flux équilibre sécurité et convivialité tout en atténuant les attaques par interception.
Flux étape par étape
- Initialisation : Le client génère un vérificateur de code (code verifier) et un défi de code (code challenge), redirigeant l'utilisateur vers le serveur d'autorisation.
- Authentification : L'utilisateur se connecte.
- Autorisation : Le serveur redirige vers le client avec un code d'autorisation.
- Échange de jetons : Le client échange le code contre un
access_token, unid_tokenet potentiellement unrefresh_token.
Lors du traitement de la réponse du point de terminaison des jetons, le serveur doit renvoyer un payload JSON similaire à celui-ci :
{
"access_token": "SlAV32hkKG",
"token_type": "Bearer",
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
"expires_in": 3600
}
Le id_token doit être validé en vérifiant sa signature par rapport à la clé publique de l'émetteur et en vérifiant les revendications telles que iss (émetteur), aud (audience) et exp (expiration).
Meilleures pratiques pour une implémentation sécurisée
L'implémentation de ces protocoles nécessite un strict respect des normes de sécurité. Utilisez toujours HTTPS pour empêcher l'interception des jetons. Ne stockez jamais les jetons dans le stockage local ou les cookies sans les drapeaux HttpOnly et Secure ; utilisez le stockage de session pour les jetons à courte durée de vie lorsque cela est approprié. De plus, implémentez toujours PKCE, même pour les applications monopages (SPA), pour vous défendre contre les attaques par interception de code d'autorisation.
Conclusion
Maîtriser OAuth 2.0 et OpenID Connect est une étape obligatoire pour les développeurs backend et frontend expérimentés. En comprenant qu'OAuth 2.0 gère la délégation et OIDC gère l'identité, vous pouvez concevoir des systèmes qui sont à la fois sécurisés et conviviaux. Rappelez-vous : utilisez OAuth pour l'accès, OIDC pour l'identité, et validez toujours rigoureusement les jetons. À mesure que le paysage des menaces évolue, se tenir à jour avec ces normes garantit que vos applications restent résilientes face aux attaques modernes basées sur l'identité.