using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using MiaoJiZhang.Domain.Entities; using Microsoft.IdentityModel.Tokens; namespace MiaoJiZhang.Api.Services; public class JwtService(IConfiguration config) { public (string Token, DateTime ExpiresAt) Issue(User user) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["Jwt:Secret"]!)); var expires = DateTime.UtcNow.AddDays(int.Parse(config["Jwt:ExpireDays"] ?? "30")); var token = new JwtSecurityToken( issuer: config["Jwt:Issuer"], audience: config["Jwt:Audience"], claims: [ new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()), new Claim(JwtRegisteredClaimNames.UniqueName, user.Username), new Claim("auth_version", user.AuthVersion.ToString()), ], expires: expires, signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)); return (new JwtSecurityTokenHandler().WriteToken(token), expires); } }