Introduction à OAuth 2.0 et JWT en C#
\nLes applications web modernes nécessitent des mécanismes de sécurité fiables. Deux protocoles clés — OAuth 2.0 et JWT (JSON Web Token) — sont devenus la norme de facto pour l'implémentation de l'autorisation et de l'authentification. Dans cet article, nous allons voir comment utiliser ces technologies dans l'écosystème C# (.NET).
\nOAuth 2.0 est un protocole d'accès délégué qui permet aux applications d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre ses identifiants. JWT, quant à lui, est un format de jeton compact et autonome souvent utilisé pour transmettre des informations d'authentification entre le client et le serveur.
\nDans ce guide, nous allons créer une simple API web en ASP.NET Core implémentant OAuth 2.0 avec des jetons JWT. Vous apprendrez à configurer la génération, la validation et la protection des points de terminaison.
\n\nQu'est-ce que OAuth 2.0 et JWT ?
\nAvant de passer au code, examinons les concepts de base.
\nOAuth 2.0
\nOAuth 2.0 définit quatre rôles :
\n- \n
- Resource Owner (propriétaire de la ressource) — généralement l'utilisateur. \n
- Client (client) — l'application qui souhaite obtenir l'accès. \n
- Authorization Server (serveur d'autorisation) — délivre les jetons. \n
- Resource Server (serveur de ressources) — fournit les données protégées. \n
Le flux principal Authorization Code Grant comprend : la redirection de l'utilisateur vers le serveur d'autorisation, l'obtention d'un code, l'échange du code contre un jeton d'accès.
\n\nJWT (JSON Web Token)
\nUn JWT se compose de trois parties séparées par des points :
\n- \n
- Header — le type de jeton et l'algorithme de signature (par exemple, HS256). \n
- Payload — les données (claims), telles que l'ID utilisateur, le rôle, la date d'expiration. \n
- Signature — la signature créée à l'aide d'une clé secrète. \n
Exemple de JWT : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Configuration du projet ASP.NET Core
\nCréons un nouveau projet d'API web avec prise en charge de l'authentification.
\ndotnet new webapi -n OAuthJwtDemo\ncd OAuthJwtDemo\nAjoutons les packages NuGet nécessaires :
\ndotnet add package Microsoft.AspNetCore.Authentication.JwtBearer\ndotnet add package System.IdentityModel.Tokens.Jwt\n\nConfiguration dans appsettings.json
\nAjoutez une section pour les paramètres JWT dans le fichier appsettings.json :
{\n "JwtSettings": {\n "SecretKey": "YOUR_SUPER_SECRET_KEY_AT_LEAST_32_CHARS",\n "Issuer": "OAuthJwtDemo",\n "Audience": "OAuthJwtDemoClient",\n "ExpirationMinutes": 60\n }\n}\nImportant : Dans un projet réel, stockez la clé secrète dans User Secrets ou Azure Key Vault.
\n\nImplémentation du service de génération JWT
\nCréons une interface et son implémentation pour travailler avec les jetons.
\nInterface IJwtService
\npublic interface IJwtService\n{\n string GenerateToken(string userId, string role);\n ClaimsPrincipal ValidateToken(string token);\n}\n\nImplémentation de JwtService
\npublic class JwtService : IJwtService\n{\n private readonly JwtSettings _settings;\n\n public JwtService(IOptions<JwtSettings> settings)\n {\n _settings = settings.Value;\n }\n\n public string GenerateToken(string userId, string role)\n {\n var claims = new[]\n {\n new Claim(ClaimTypes.NameIdentifier, userId),\n new Claim(ClaimTypes.Role, role),\n new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())\n };\n\n var key = new Symmetric