using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using Knot.Modules.Identity.Application.Abstractions; using Knot.Modules.Identity.Domain; namespace Knot.Modules.Identity.Infrastructure.Authentication; public sealed class JwtTokenProvider : IJwtTokenProvider { private readonly IConfiguration _configuration; public JwtTokenProvider(IConfiguration configuration) { _configuration = configuration; } public string Generate(User user) { var claims = new Claim[] { new(JwtRegisteredClaimNames.Sub, user.Id.ToString()), new(JwtRegisteredClaimNames.UniqueName, user.Username), new("name", user.DisplayName), new(ClaimTypes.Name, user.DisplayName), new("avatar", user.Avatar ?? string.Empty) }; var secretKey = _configuration["Jwt:Secret"]!; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( _configuration["Jwt:Issuer"], _configuration["Jwt:Audience"], claims, null, DateTime.UtcNow.AddMinutes(double.Parse(_configuration["Jwt:ExpiryInMinutes"] ?? "1440")), credentials); return new JwtSecurityTokenHandler().WriteToken(token); } }