All checks were successful
Build Docker Images / test (map[name:Morska plugin_project:DiunaBI.Plugins.Morska]) (push) Successful in 1m32s
Build Docker Images / test (map[name:PedrolloPL plugin_project:DiunaBI.Plugins.PedrolloPL]) (push) Successful in 1m30s
Build Docker Images / build-and-push (map[image_suffix:morska name:Morska plugin_project:DiunaBI.Plugins.Morska]) (push) Successful in 1m51s
Build Docker Images / build-and-push (map[image_suffix:pedrollopl name:PedrolloPL plugin_project:DiunaBI.Plugins.PedrolloPL]) (push) Successful in 1m50s
85 lines
2.9 KiB
C#
85 lines
2.9 KiB
C#
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
using DiunaBI.Domain.Entities;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
namespace DiunaBI.API.Services;
|
|
|
|
public class JwtTokenService(IConfiguration configuration, ILogger<JwtTokenService> logger)
|
|
{
|
|
private readonly IConfiguration _configuration = configuration;
|
|
private readonly ILogger<JwtTokenService> _logger = logger;
|
|
|
|
public string GenerateToken(User user)
|
|
{
|
|
var jwtSettings = _configuration.GetSection("JwtSettings");
|
|
var securityKey = jwtSettings["SecurityKey"];
|
|
var issuer = jwtSettings["Issuer"];
|
|
var audience = jwtSettings["Audience"];
|
|
var expiryDays = int.Parse(jwtSettings["ExpiryDays"] ?? "7");
|
|
|
|
var claims = new[]
|
|
{
|
|
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
|
|
new Claim(ClaimTypes.Email, user.Email),
|
|
new Claim(ClaimTypes.Name, user.UserName),
|
|
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
|
|
new Claim(JwtRegisteredClaimNames.Iat, new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds().ToString(),
|
|
ClaimValueTypes.Integer64)
|
|
};
|
|
|
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(securityKey));
|
|
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
|
|
|
var token = new JwtSecurityToken(
|
|
issuer: issuer,
|
|
audience: audience,
|
|
claims: claims,
|
|
expires: DateTime.UtcNow.AddDays(expiryDays),
|
|
signingCredentials: creds
|
|
);
|
|
|
|
var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
|
|
|
|
_logger.LogInformation("Generated JWT token for user: {Email}", user.Email);
|
|
|
|
return tokenString;
|
|
}
|
|
|
|
public ClaimsPrincipal? ValidateToken(string token)
|
|
{
|
|
try
|
|
{
|
|
var jwtSettings = _configuration.GetSection("JwtSettings");
|
|
var secretKey = jwtSettings["SecurityKey"];
|
|
var issuer = jwtSettings["Issuer"];
|
|
var audience = jwtSettings["Audience"];
|
|
|
|
var tokenHandler = new JwtSecurityTokenHandler();
|
|
var key = Encoding.UTF8.GetBytes(secretKey);
|
|
|
|
var validationParameters = new TokenValidationParameters
|
|
{
|
|
ValidateIssuer = true,
|
|
ValidateAudience = true,
|
|
ValidateLifetime = true,
|
|
ValidateIssuerSigningKey = true,
|
|
ValidIssuer = issuer,
|
|
ValidAudience = audience,
|
|
IssuerSigningKey = new SymmetricSecurityKey(key),
|
|
ClockSkew = TimeSpan.Zero
|
|
};
|
|
|
|
var principal = tokenHandler.ValidateToken(token, validationParameters, out _);
|
|
return principal;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "Error validating JWT token");
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|