diff --git a/TaxBaik.Web/Services/TokenRefreshHandler.cs b/TaxBaik.Web/Services/TokenRefreshHandler.cs index a7e450c..65cb762 100644 --- a/TaxBaik.Web/Services/TokenRefreshHandler.cs +++ b/TaxBaik.Web/Services/TokenRefreshHandler.cs @@ -10,12 +10,12 @@ using System.Text.Json; /// public class TokenRefreshHandler : DelegatingHandler { - private readonly ITokenStore _tokenStore; + private readonly IServiceProvider _serviceProvider; private readonly ILogger _logger; - public TokenRefreshHandler(ITokenStore tokenStore, ILogger logger) + public TokenRefreshHandler(IServiceProvider serviceProvider, ILogger logger) { - _tokenStore = tokenStore; + _serviceProvider = serviceProvider; _logger = logger; } @@ -23,10 +23,13 @@ public class TokenRefreshHandler : DelegatingHandler HttpRequestMessage request, CancellationToken cancellationToken) { + // 최신 Scoped ITokenStore 실시간 해석 (Scope Capture 차단 및 기존 Blazor 회로 수명 공유) + var tokenStore = Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(_serviceProvider); + // 요청에 access token 추가 - if (!string.IsNullOrEmpty(_tokenStore.AccessToken)) + if (!string.IsNullOrEmpty(tokenStore.AccessToken)) { - request.Headers.Authorization = new("Bearer", _tokenStore.AccessToken); + request.Headers.Authorization = new("Bearer", tokenStore.AccessToken); } var response = await base.SendAsync(request, cancellationToken); @@ -34,15 +37,15 @@ public class TokenRefreshHandler : DelegatingHandler // 401 응답이면 토큰 갱신 시도 if (response.StatusCode == HttpStatusCode.Unauthorized) { - if (!string.IsNullOrEmpty(_tokenStore.RefreshToken)) + if (!string.IsNullOrEmpty(tokenStore.RefreshToken)) { - var newTokenPair = await RefreshTokenAsync(_tokenStore.RefreshToken, request, cancellationToken); + var newTokenPair = await RefreshTokenAsync(tokenStore.RefreshToken, request, cancellationToken); if (newTokenPair != null) { // TokenStore에 토큰 저장 - _tokenStore.AccessToken = newTokenPair.AccessToken; - _tokenStore.RefreshToken = newTokenPair.RefreshToken; - _tokenStore.TokenExpiryTicks = DateTime.UtcNow.AddSeconds(newTokenPair.ExpiresIn).Ticks; + tokenStore.AccessToken = newTokenPair.AccessToken; + tokenStore.RefreshToken = newTokenPair.RefreshToken; + tokenStore.TokenExpiryTicks = DateTime.UtcNow.AddSeconds(newTokenPair.ExpiresIn).Ticks; // 새 토큰으로 재요청 request.Headers.Authorization = new("Bearer", newTokenPair.AccessToken); @@ -51,7 +54,7 @@ public class TokenRefreshHandler : DelegatingHandler else { _logger.LogWarning("토큰 갱신 실패 - 로그아웃"); - _tokenStore.Clear(); + tokenStore.Clear(); } } }