using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using DomainResults.Common; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; namespace JWTService { public interface IJWTService { string CreateJwtToken(DateTime expires, List>? claims); (List>?, IDomainResult) JwtTokenClaims(string token); } public class JWTService : IJWTService { private readonly ILogger _logger; private readonly IJwtConfig _configuration; public JWTService( ILogger logger, IJwtConfig configuration ) { _logger = logger; _configuration = configuration; } public string CreateJwtToken(DateTime expires, List>? claims) => CreateJwtToken(_configuration.Secret, expires, claims); public string CreateJwtToken(string secret, DateTime expires, List>? claims) { // add roles to claims identity from database var tokenClaims = new List(); if (claims != null) foreach (var claim in claims) tokenClaims.Add(new Claim(claim.Key, claim.Value)); var tokenHandler = new JwtSecurityTokenHandler(); var securityToken = tokenHandler.CreateToken(new SecurityTokenDescriptor { IssuedAt = DateTime.UtcNow, Subject = new ClaimsIdentity(tokenClaims), Expires = expires, SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Convert.FromBase64String(secret)), SecurityAlgorithms.HmacSha512Signature), }); _logger.LogInformation($"Creted new JWT {securityToken}"); return tokenHandler.WriteToken(securityToken); } public (List>?, IDomainResult) JwtTokenClaims(string token) { var securityToken = new JwtSecurityTokenHandler().ReadToken(token) as JwtSecurityToken; var claims = securityToken?.Claims?.Select(x => new KeyValuePair(x.Type, x.Value)); if (claims == null) return IDomainResult.Failed>?>(); return claims.Count() > 0 ? IDomainResult.Success(claims.ToList()) : IDomainResult.NotFound>?>(); } } }