using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using SchotzIadKmTracker.Api.Configuration; using SchotzIadKmTracker.Api.Models.Entities; namespace SchotzIadKmTracker.Api.Services; /// /// Implémentation de émettant des jetons JWT signés en HMAC-SHA256 /// à partir des options . /// public class JwtService : IJwtService { private readonly JwtOptions _options; /// /// Initialise le service à partir des options JWT liées à la configuration. /// /// Options JWT (clé secrète, émetteur, audience, durée d'expiration). public JwtService(IOptions options) { _options = options.Value; } /// public string GenererJeton(Compte compte) { // Claims émis : sub = identifiant du compte, email = adresse du compte, // jti = identifiant unique du jeton. Aucune donnée sensible (jamais le hash du mot de passe). var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, compte.Id.ToString()), new Claim(JwtRegisteredClaimNames.Email, compte.Email), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; // Signature symétrique HMAC-SHA256 à partir de la clé secrète configurée. var cleSignature = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.SecretKey)); var identifiants = new SigningCredentials(cleSignature, SecurityAlgorithms.HmacSha256); // Expiration = instant courant + durée configurée (720 min / 12 h par défaut). var expiration = DateTime.UtcNow.AddMinutes(_options.ExpirationMinutes); var jeton = new JwtSecurityToken( issuer: _options.Issuer, audience: _options.Audience, claims: claims, notBefore: DateTime.UtcNow, expires: expiration, signingCredentials: identifiants); return new JwtSecurityTokenHandler().WriteToken(jeton); } }