From 6914bba007439fe426d051b1f411be33493b2e34 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Wed, 19 Mar 2025 12:40:05 +0900 Subject: [PATCH] =?UTF-8?q?[=E2=9C=A8]=20API=20Header=20=EC=A0=90=EA=B2=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=A4=91=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 10 ++-- Program/Common/Auth/APIHeaderFilter.cs | 27 ----------- ...HeaderMiddle.cs => APIHeaderMiddleware.cs} | 47 +++++++++---------- .../{JWTToken => Auth}/JwtTokenService.cs | 8 ---- 4 files changed, 25 insertions(+), 67 deletions(-) delete mode 100644 Program/Common/Auth/APIHeaderFilter.cs rename Program/Common/Auth/{APIHeaderMiddle.cs => APIHeaderMiddleware.cs} (54%) rename Program/Common/{JWTToken => Auth}/JwtTokenService.cs (98%) diff --git a/Program.cs b/Program.cs index 3fea917..468caf6 100644 --- a/Program.cs +++ b/Program.cs @@ -115,6 +115,7 @@ builder.Services.AddControllers(); // 여기다가 API 있는 컨트롤러들 AddScoped 하면 되는건가? builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); // builder.Services.AddScoped(); // // builder.Services.AddScoped(); @@ -156,7 +157,7 @@ builder.Services.AddScoped(); // 로컬 테스트 위한 부분 (올릴때는 꺼두기) -builder.WebHost.UseUrls("http://0.0.0.0:5144"); +// builder.WebHost.UseUrls("http://0.0.0.0:5144"); ///// ===== builder 설정 부 ===== ///// @@ -176,13 +177,10 @@ else } // 로컬 테스트 위한 부분 (올릴떄는 켜두기) -// app.UseHttpsRedirection(); +app.UseHttpsRedirection(); // 헤더 미들웨어 부분 -app.UseMiddleware(new string[] { "X-MyHeader1", "X-MyHeader2", "X-MyHeader3" }); - - -// 이부분 봐야 합니다. +app.UseMiddleware((object)new string[] { "iOS_AM_Connect_Key", "And_AM_Connect_Key", "Web_AM_Connect_Key" }); // app.UseMiddleware("X-MyHeader"); diff --git a/Program/Common/Auth/APIHeaderFilter.cs b/Program/Common/Auth/APIHeaderFilter.cs deleted file mode 100644 index 766fba0..0000000 --- a/Program/Common/Auth/APIHeaderFilter.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - - -namespace AcaMate.Common.Token; - -public class APIHeaderFilter : ActionFilterAttribute -{ - private readonly string _headerName; - - public APIHeaderFilter(string headerName) - { - _headerName = headerName; - } - - public override void OnActionExecuted(ActionExecutedContext context) - { - if (!context.HttpContext.Request.Headers.TryGetValue(_headerName, out var headerValues) || - string.IsNullOrWhiteSpace(headerValues)) - { - context.Result = new BadRequestObjectResult($"Missing or empty header: {_headerName}"); - } - - base.OnActionExecuted(context); - } - -} \ No newline at end of file diff --git a/Program/Common/Auth/APIHeaderMiddle.cs b/Program/Common/Auth/APIHeaderMiddleware.cs similarity index 54% rename from Program/Common/Auth/APIHeaderMiddle.cs rename to Program/Common/Auth/APIHeaderMiddleware.cs index 7d757f1..ab4c7f9 100644 --- a/Program/Common/Auth/APIHeaderMiddle.cs +++ b/Program/Common/Auth/APIHeaderMiddleware.cs @@ -4,64 +4,66 @@ using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; namespace AcaMate.Common.Token; + public interface IHeaderConfig -{ +{ Task GetExpectedHeaderValueAsync(string headerName); } +/// +/// DB에서 헤더 키값 찾아서 그 밸류 값 빼오기 위해서 사용 +/// public class HeaderConfigRepository : IHeaderConfig { private readonly AppDbContext _dbContext; - + public HeaderConfigRepository(AppDbContext dbContext) { _dbContext = dbContext; } - + public async Task GetExpectedHeaderValueAsync(string headerName) { - // 예를 들어, HeaderConfig 테이블에 헤더 이름과 기대 값이 저장되어 있다고 가정합니다. - var config = await _dbContext.APIHeader. - FirstOrDefaultAsync(h => h.h_key == headerName); + var config = await _dbContext.APIHeader + .FirstOrDefaultAsync(h => h.h_key == headerName); return config?.h_value ?? string.Empty; } + } - public class APIHeaderMiddleware { private readonly RequestDelegate _next; private readonly string[] _headerNames; - private readonly IHeaderConfig _headerConfig; + // private readonly IHeaderConfig _headerConfig; - public APIHeaderMiddleware(RequestDelegate next, string[] headerNames, IHeaderConfig headerConfig) + public APIHeaderMiddleware(RequestDelegate next, string[] headerNames)//, IHeaderConfig headerConfig) { _next = next; _headerNames = headerNames; - _headerConfig = headerConfig; } public async Task Invoke(HttpContext context) { + // Scoped 사용해서 값 가져오는 곳임 + var headerConfig = context.RequestServices.GetRequiredService(); + bool valid = false; foreach (var header in _headerNames) { - - if (!context.Request.Headers.TryGetValue(header, out var headerValue) && + /// context.Request.Headers.TryGetValue(header, out var headerValue) + /// header 를 찾는데 header + if (context.Request.Headers.TryGetValue(header, out var headerValue) && !string.IsNullOrWhiteSpace(headerValue)) - // if (!context.Request.Headers.ContainsKey(_headerName) || string.IsNullOrWhiteSpace(context.Request.Headers[_headerName])) { - var expectedValue = await _headerConfig.GetExpectedHeaderValueAsync(header); - if (headerValue == expectedValue) + var dbValue = await headerConfig.GetExpectedHeaderValueAsync(header); + if (headerValue == dbValue) { valid = true; break; } - // context.Response.StatusCode = StatusCodes.Status400BadRequest; - // await context.Response.WriteAsync($"Missing or empty header: {headerName}"); - // return; } } @@ -71,14 +73,7 @@ public class APIHeaderMiddleware await context.Response.WriteAsync($"Invalid header value"); return; } - // if (headerValue != expectedValue) - // { - // context.Response.StatusCode = StatusCodes.Status401Unauthorized; - // await context.Response.WriteAsync($"Invalid header value"); - // return; - // } - // - // } + await _next(context); } } \ No newline at end of file diff --git a/Program/Common/JWTToken/JwtTokenService.cs b/Program/Common/Auth/JwtTokenService.cs similarity index 98% rename from Program/Common/JWTToken/JwtTokenService.cs rename to Program/Common/Auth/JwtTokenService.cs index c771df8..909fb9e 100644 --- a/Program/Common/JWTToken/JwtTokenService.cs +++ b/Program/Common/Auth/JwtTokenService.cs @@ -105,13 +105,5 @@ public class JwtTokenService _logger.LogError($"엑세스 토큰 오류: {ex.Message}"); return null; } - - } - - - - - - } \ No newline at end of file