using AutoMapper; using DigitalData.Core.Abstractions.Security; using DigitalData.Core.Security.Config; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; namespace DigitalData.Core.Security { public class JwtSignatureHandler : JwtSecurityTokenHandler, IJwtSignatureHandler { private readonly ClaimDescriptor _claimDescriptor; private readonly IMapper _mapper; private readonly ICryptoFactory _cryptoFactory; public JwtSignatureHandler(IOptions> claimDescriptorOptions, IMapper mapper, ICryptoFactory cryptoFactory) { _claimDescriptor = claimDescriptorOptions.Value; _mapper = mapper; _cryptoFactory = cryptoFactory; } public SecurityToken CreateToken(TPrincipal subject, IAsymmetricTokenDescriptor descriptor) { var sDescriptor = _mapper.Map(descriptor); sDescriptor.Claims = _claimDescriptor.CreateClaims?.Invoke(subject); sDescriptor.Subject = _claimDescriptor.CreateSubject?.Invoke(subject); return CreateToken(sDescriptor); } public SecurityToken CreateToken(TPrincipal subject, string issuer, string audience) { var descriptor = _cryptoFactory.TokenDescriptors.Get(issuer: issuer, audience: audience) ?? throw new InvalidOperationException($"No or multiple token description found for issuer '{issuer}' and audience '{audience}'."); return CreateToken(subject: subject, descriptor: descriptor); } } }