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);
}
}