JwtTokenProvider.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. public string CreateOAuth2AccessToken(int applicationID, string clientID, int ownerMemberID, IEnumerable<string> scopes, TimeSpan ttl)
  44. {
  45. var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwt.SecretKey));
  46. var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
  47. var scopeList = scopes as IList<string> ?? scopes.ToList();
  48. var claims = new List<Claim>
  49. {
  50. new(JwtRegisteredClaimNames.Sub, ownerMemberID.ToString()),
  51. new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
  52. new("app_id", applicationID.ToString()),
  53. new("client_id", clientID),
  54. new("token_id", applicationID.ToString()),
  55. new("token_type", "oauth2"),
  56. new("scope", string.Join(' ', scopeList))
  57. };
  58. foreach (var s in scopeList)
  59. {
  60. claims.Add(new Claim("scp", s));
  61. }
  62. var tokenDescriptor = new SecurityTokenDescriptor
  63. {
  64. Subject = new ClaimsIdentity(claims),
  65. Expires = DateTime.UtcNow.Add(ttl),
  66. SigningCredentials = credentials,
  67. Issuer = _jwt.Issuer,
  68. Audience = "antooza-public-api"
  69. };
  70. var handler = new JsonWebTokenHandler();
  71. return handler.CreateToken(tokenDescriptor);
  72. }
  73. }