From 91482f9f1c8353246aef00204cd7567cb0878504 Mon Sep 17 00:00:00 2001 From: Bruno Date: Mon, 27 Jan 2025 18:51:51 -0300 Subject: [PATCH] hotfix --- .../Attributes/TryAutenticaAttribute.cs | 5 ++ OpenAdm.Api/Controllers/ProdutoController.cs | 2 + OpenAdm.Api/Middlewares/InjectMiddleware.cs | 1 + .../Middlewares/TryAutenticaMiddleware.cs | 89 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 OpenAdm.Api/Attributes/TryAutenticaAttribute.cs create mode 100644 OpenAdm.Api/Middlewares/TryAutenticaMiddleware.cs diff --git a/OpenAdm.Api/Attributes/TryAutenticaAttribute.cs b/OpenAdm.Api/Attributes/TryAutenticaAttribute.cs new file mode 100644 index 0000000..84097cd --- /dev/null +++ b/OpenAdm.Api/Attributes/TryAutenticaAttribute.cs @@ -0,0 +1,5 @@ +namespace OpenAdm.Api.Attributes; + +public class TryAutenticaAttribute : Attribute +{ +} diff --git a/OpenAdm.Api/Controllers/ProdutoController.cs b/OpenAdm.Api/Controllers/ProdutoController.cs index aaed109..d6a6fb7 100644 --- a/OpenAdm.Api/Controllers/ProdutoController.cs +++ b/OpenAdm.Api/Controllers/ProdutoController.cs @@ -20,6 +20,7 @@ public ProdutoController(IProdutoService produtoService) } [HttpGet("list")] + [TryAutentica] public async Task ListProdutos([FromQuery] PaginacaoProdutoEcommerceDto paginacaoProdutoEcommerceDto) { var result = await _produtoService.GetProdutosAsync(paginacaoProdutoEcommerceDto); @@ -35,6 +36,7 @@ public async Task ListAllProdutos() [ResponseCache(CacheProfileName = "Default300")] [HttpGet("list-by-categorias")] + [TryAutentica] public async Task ListProdutosByCategorias([FromQuery] Guid categoriaId) { var result = await _produtoService.GetProdutosByCategoriaIdAsync(categoriaId); diff --git a/OpenAdm.Api/Middlewares/InjectMiddleware.cs b/OpenAdm.Api/Middlewares/InjectMiddleware.cs index 81176bc..8732b27 100644 --- a/OpenAdm.Api/Middlewares/InjectMiddleware.cs +++ b/OpenAdm.Api/Middlewares/InjectMiddleware.cs @@ -11,5 +11,6 @@ public static void AddMiddlewaresApi(this WebApplication app) app.UseMiddleware(); app.UseMiddleware(); app.UseMiddleware(); + app.UseMiddleware(); } } diff --git a/OpenAdm.Api/Middlewares/TryAutenticaMiddleware.cs b/OpenAdm.Api/Middlewares/TryAutenticaMiddleware.cs new file mode 100644 index 0000000..883116e --- /dev/null +++ b/OpenAdm.Api/Middlewares/TryAutenticaMiddleware.cs @@ -0,0 +1,89 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Text; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.IdentityModel.Tokens; +using OpenAdm.Api.Attributes; +using OpenAdm.Application.Models.Tokens; +using OpenAdm.Domain.Exceptions; +using OpenAdm.Domain.Interfaces; + +namespace OpenAdm.Api.Middlewares; + +public class TryAutenticaMiddleware +{ + private readonly RequestDelegate _next; + public TryAutenticaMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke( + HttpContext httpContext, + IUsuarioAutenticado usuarioAutenticado) + { + if (usuarioAutenticado.Id != Guid.Empty) + { + await _next(httpContext); + return; + } + + var autenticar = httpContext.Features.Get()?.Endpoint?.Metadata + .FirstOrDefault(m => m is TryAutenticaAttribute) is TryAutenticaAttribute atributoAutorizacao; + + if (!autenticar) + { + await _next(httpContext); + return; + } + + var token = httpContext.Request.Headers.Authorization.ToString().Split(" ").Last().Replace("Bearer", "")?.Trim(); + + if (string.IsNullOrWhiteSpace(token)) + { + await _next(httpContext); + return; + } + + var keyJwt = VariaveisDeAmbiente.GetVariavel("JWT_KEY"); + + try + { + var tokenHandler = new JwtSecurityTokenHandler(); + tokenHandler.ValidateToken(token, new TokenValidationParameters + { + ValidateIssuer = true, + ValidateAudience = true, + ValidateLifetime = false, + ValidateIssuerSigningKey = true, + ValidIssuer = ConfiguracaoDeToken.Issue, + ValidAudience = ConfiguracaoDeToken.Audience, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(ConfiguracaoDeToken.Key)) + }, out SecurityToken validatedToken); + + var jwtToken = (JwtSecurityToken)validatedToken; + + var id = jwtToken.Claims.FirstOrDefault(c => c.Type == "Id")?.Value + ?? throw new ExceptionUnauthorize("Token inválido"); + var isFuncionario = jwtToken.Claims.FirstOrDefault(c => c.Type == "IsFuncionario")?.Value; + + if (!Guid.TryParse(id, out Guid idParse)) + { + throw new ExceptionUnauthorize("Por favor, efetue o login novamente"); + } + + usuarioAutenticado.Id = idParse; + usuarioAutenticado.IsFuncionario = !string.IsNullOrWhiteSpace(isFuncionario) && isFuncionario == "TRUE"; + + } + catch (SecurityTokenExpiredException) + { + throw new ExceptionUnauthorize("Sessão expirada, efetue o login novamente!"); + } + catch (Exception) + { + throw new ExceptionUnauthorize("Efetue o login novamente!"); + } + + await _next(httpContext); + } +}