JwtTokenProvider.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using SharedKernel;
  2. using System.Security.Claims;
  3. using System.Security.Cryptography;
  4. using System.Text;
  5. using Application.Abstractions.Authentication;
  6. using Microsoft.Extensions.Options;
  7. using Microsoft.IdentityModel.JsonWebTokens;
  8. using Microsoft.IdentityModel.Tokens;
  9. namespace Infrastructure.Authentication;
  10. internal sealed class JwtTokenProvider(IOptions<AppSettings> options) : IJwtTokenProvider
  11. {
  12. private readonly AppSettings.JwtSection _jwt = options.Value.JWT;
  13. public string CreateAccessToken(int memberID, string email, string? name)
  14. {
  15. var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwt.SecretKey));
  16. var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
  17. var claims = new List<Claim>
  18. {
  19. new(JwtRegisteredClaimNames.Sub, memberID.ToString()),
  20. new(JwtRegisteredClaimNames.Email, email),
  21. new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
  22. };
  23. if (!string.IsNullOrEmpty(name))
  24. {
  25. claims.Add(new Claim(JwtRegisteredClaimNames.Name, name));
  26. }
  27. var tokenDescriptor = new SecurityTokenDescriptor
  28. {
  29. Subject = new ClaimsIdentity(claims),
  30. Expires = DateTime.UtcNow.AddMinutes(_jwt.AccessTokenExpiration),
  31. SigningCredentials = credentials,
  32. Issuer = _jwt.Issuer,
  33. Audience = _jwt.Audience
  34. };
  35. var handler = new JsonWebTokenHandler();
  36. return handler.CreateToken(tokenDescriptor);
  37. }
  38. public string CreateRefreshToken()
  39. {
  40. var randomBytes = RandomNumberGenerator.GetBytes(64);
  41. return Convert.ToBase64String(randomBytes);
  42. }
  43. }