1- using Microsoft . AspNetCore . Mvc ;
21using Microsoft . AspNetCore . Mvc . Filters ;
3- using Microsoft . Extensions . Logging ;
42using ProjectVG . Infrastructure . Auth ;
53using System . Security . Claims ;
64
@@ -13,90 +11,33 @@ public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
1311 {
1412 var logger = context . HttpContext . RequestServices . GetRequiredService < ILogger < JwtAuthenticationAttribute > > ( ) ;
1513 var tokenService = context . HttpContext . RequestServices . GetRequiredService < ITokenService > ( ) ;
16-
17- // 디버그: 모든 헤더 로깅
18- logger . LogInformation ( "=== JWT 인증 디버그 시작 ===" ) ;
19- logger . LogInformation ( "요청 경로: {Path}" , context . HttpContext . Request . Path ) ;
20- logger . LogInformation ( "요청 메서드: {Method}" , context . HttpContext . Request . Method ) ;
21- logger . LogInformation ( "원격 IP: {RemoteIP}" , context . HttpContext . Connection . RemoteIpAddress ) ;
22-
23- // 모든 헤더 로깅
24- foreach ( var header in context . HttpContext . Request . Headers )
25- {
26- logger . LogInformation ( "헤더: {Key} = {Value}" , header . Key , header . Value ) ;
27- }
28-
29- var token = ExtractTokenFromHeader ( context . HttpContext . Request , logger ) ;
30- if ( string . IsNullOrEmpty ( token ) )
31- {
32- logger . LogWarning ( "인증 헤더가 없거나 유효하지 않음" ) ;
33- context . Result = new UnauthorizedObjectResult ( new
34- {
35- success = false ,
36- message = "Authorization header is missing or invalid" ,
37- debug = new
38- {
39- headers = context . HttpContext . Request . Headers . ToDictionary ( h => h . Key , h => h . Value . ToString ( ) ) ,
40- hasAuthorization = context . HttpContext . Request . Headers . ContainsKey ( "Authorization" ) ,
41- authorizationValue = context . HttpContext . Request . Headers [ "Authorization" ] . FirstOrDefault ( )
42- }
43- } ) ;
44- return ;
45- }
4614
47- logger . LogInformation ( "토큰 추출 성공. 토큰 길이: {TokenLength}" , token . Length ) ;
48- logger . LogInformation ( "토큰 미리보기: {TokenPreview}" , token . Length > 20 ? token . Substring ( 0 , 20 ) + "..." : token ) ;
15+ var token = ExtractToken ( context . HttpContext . Request ) ;
16+ if ( string . IsNullOrEmpty ( token ) ) {
17+ throw new AuthenticationException ( ErrorCode . TOKEN_MISSING ) ;
18+ }
4919
50- var isValid = await tokenService . ValidateAccessTokenAsync ( token ) ;
51- logger . LogInformation ( "토큰 검증 결과: {IsValid}" , isValid ) ;
52-
53- if ( ! isValid )
54- {
55- logger . LogWarning ( "토큰 검증 실패" ) ;
56- context . Result = new UnauthorizedObjectResult ( new
57- {
58- success = false ,
59- message = "Invalid or expired access token" ,
60- debug = new
61- {
62- tokenLength = token . Length ,
63- tokenPreview = token . Length > 20 ? token . Substring ( 0 , 20 ) + "..." : token
64- }
65- } ) ;
66- return ;
20+ if ( ! await tokenService . ValidateAccessTokenAsync ( token ) ) {
21+ throw new AuthenticationException ( ErrorCode . TOKEN_INVALID ) ;
6722 }
6823
6924 var userId = await tokenService . GetUserIdFromTokenAsync ( token ) ;
70- logger . LogInformation ( "추출된 사용자 ID: {UserId}" , userId ) ;
71-
72- if ( ! userId . HasValue )
73- {
74- logger . LogWarning ( "토큰에서 사용자 ID를 추출할 수 없음" ) ;
75- context . Result = new UnauthorizedObjectResult ( new
76- {
77- success = false ,
78- message = "Unable to extract user information from token"
79- } ) ;
80- return ;
25+ if ( ! userId . HasValue ) {
26+ throw new AuthenticationException ( ErrorCode . AUTHENTICATION_FAILED ) ;
8127 }
8228
83- // ClaimsPrincipal 생성하여 HttpContext에 설정
8429 var claims = new List < Claim >
8530 {
8631 new Claim ( ClaimTypes . NameIdentifier , userId . Value . ToString ( ) ) ,
8732 new Claim ( "user_id" , userId . Value . ToString ( ) )
8833 } ;
8934
90- var identity = new ClaimsIdentity ( claims , "Bearer" ) ;
91- var principal = new ClaimsPrincipal ( identity ) ;
92-
93- context . HttpContext . User = principal ;
35+ context . HttpContext . User = new ClaimsPrincipal ( new ClaimsIdentity ( claims , "Bearer" ) ) ;
9436 logger . LogInformation ( "JWT 인증 성공 - 사용자: {UserId}" , userId . Value ) ;
9537 }
9638
97- private string ? ExtractTokenFromHeader ( HttpRequest request , ILogger logger )
39+ private string ? ExtractToken ( HttpRequest request )
9840 {
99- // Nginx 관련 헤더들도 확인
10041 var possibleHeaders = new [ ]
10142 {
10243 "Authorization" ,
@@ -105,22 +46,13 @@ public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
10546 "HTTP_AUTHORIZATION"
10647 } ;
10748
108- foreach ( var headerName in possibleHeaders )
109- {
49+ foreach ( var headerName in possibleHeaders ) {
11050 var headerValue = request . Headers [ headerName ] . FirstOrDefault ( ) ;
111- logger . LogInformation ( "헤더 확인 중 '{HeaderName}': {HeaderValue}" , headerName , headerValue ) ;
112-
113- if ( ! string . IsNullOrEmpty ( headerValue ) && headerValue . StartsWith ( "Bearer " ) )
114- {
115- var token = headerValue . Substring ( "Bearer " . Length ) ;
116- logger . LogInformation ( "헤더 '{HeaderName}'에서 토큰 발견: {TokenLength} 문자" , headerName , token . Length ) ;
117- return token ;
51+ if ( ! string . IsNullOrEmpty ( headerValue ) && headerValue . StartsWith ( "Bearer " ) ) {
52+ return headerValue . Substring ( "Bearer " . Length ) . Trim ( ) ;
11853 }
11954 }
12055
121- // Authorization 헤더가 없거나 Bearer로 시작하지 않는 경우
122- var authHeader = request . Headers [ "Authorization" ] . FirstOrDefault ( ) ;
123- logger . LogWarning ( "유효한 Authorization 헤더를 찾을 수 없음. 원본 Authorization: {AuthHeader}" , authHeader ) ;
12456 return null ;
12557 }
12658 }
0 commit comments