using Microsoft.AspNetCore.Identity; using Microsoft.IdentityModel.Tokens; using PlaylistShared.Api.Entities; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; namespace PlaylistShared.Api.Services; public class JwtService { private readonly IConfiguration _configuration; private readonly UserManager _userManager; public JwtService(IConfiguration configuration, UserManager userManager) { _configuration = configuration; _userManager = userManager; } public async Task<(string Token, string RefreshToken, DateTime Expiration)> GenerateTokenAsync(ApplicationUser user) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]!); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), new Claim(ClaimTypes.Name, user.UserName!), new Claim(ClaimTypes.Email, user.Email!), }), Expires = DateTime.UtcNow.AddHours(1), Issuer = _configuration["Jwt:Issuer"], Audience = _configuration["Jwt:Audience"], SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); var tokenString = tokenHandler.WriteToken(token); var refreshToken = Guid.NewGuid().ToString(); user.RefreshToken = refreshToken; user.RefreshTokenExpiryUtc = DateTime.UtcNow.AddDays(7); await _userManager.UpdateAsync(user); return (tokenString, refreshToken, tokenDescriptor.Expires.Value); } }