using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Security.Cryptography; using System.Text; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using RT.Application.Services.Contract; namespace RT.Application.Services.Implementation; public class TokenService(IConfiguration configuration) : ITokenService { public (string token, DateTime expiresAt) GenerateToken(string userId, string email, string userName) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var expires = DateTime.UtcNow.AddMinutes(double.Parse(configuration["Jwt:ExpiresMinutes"] ?? "60")); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, userId), new Claim(JwtRegisteredClaimNames.Email, email), new Claim(JwtRegisteredClaimNames.Name, userName), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), }; var token = new JwtSecurityToken( issuer: configuration["Jwt:Issuer"], audience: configuration["Jwt:Audience"], claims: claims, expires: expires, signingCredentials: creds); return (new JwtSecurityTokenHandler().WriteToken(token), expires); } public (string token, DateTime expiresAt) GenerateRefreshToken() { var token = Convert.ToBase64String(RandomNumberGenerator.GetBytes(64)); var expires = DateTime.UtcNow.AddDays(double.Parse(configuration["Jwt:RefreshExpiresDays"] ?? "7")); return (token, expires); } }