using System.Security.Claims; using System.Text.Json; using Back.Program.Common.Data; using Back.Program.Common.Model; using Back.Program.Services.V1.Interfaces; namespace Back.Program.Common.Auth; public class DedicateWeb( ILogger _logger, SessionManager _sessionManager, IRepositoryService _repositoryService, JwtTokenService _jwtTokenService, IAppService _appService) { public async Task<(string code, string result)> GetAuthToken() { var summary = "GetAuthToken"; try { // 1. 세션에서 토큰 가져오기 var (result, token) = await _sessionManager.GetString("token"); _logger.LogInformation($"세션에서 토큰 가져오기 결과: {result}, 토큰: {token}"); if (!result || string.IsNullOrEmpty(token)) { _logger.LogWarning($"세션에 토큰이 없습니다"); return ("200", "세션에 토큰 없음"); } // 2. 토큰 검증 var validToken = await _jwtTokenService.ValidateToken(token); _logger.LogInformation($"토큰 검증 결과: {validToken != null}"); if (validToken == null) { // 3. 토큰이 유효하지 않으면 리프레시 토큰으로 새 토큰 발급 시도 var (refreshResult, refreshToken) = await _sessionManager.GetString("refresh"); _logger.LogInformation($"리프레시 토큰 가져오기 결과: {refreshResult}, 토큰: {refreshToken}"); if (!refreshResult || string.IsNullOrEmpty(refreshToken)) { _logger.LogWarning($"리프레시 토큰이 없습니다"); return ("200", "리프레시 토큰 없음"); } // 4. 리프레시 토큰으로 새 토큰 발급 var retryResult = await _appService.RetryAccess(summary, refreshToken); _logger.LogInformation($"토큰 재발급 결과: {retryResult.status.code}"); if (retryResult.status.code == "000") { // 5. 새 토큰을 세션에 저장 var data = JsonSerializer.Deserialize(JsonSerializer.Serialize(retryResult.data)); var newToken = data.GetProperty("access").GetString(); await _sessionManager.SetString("token", newToken); _logger.LogInformation($"[{summary}] 새 토큰 세션 저장 완료"); return ("000", newToken); } else { _logger.LogWarning($"[{summary}] 토큰 갱신 실패: {retryResult.status.message}"); return ("102", "토큰 갱신 실패"); } } return ("000", token); } catch (Exception ex) { _logger.LogError($"[{summary}] 세션 데이터 조회 중 오류: {ex.Message}"); _logger.LogError($"[{summary}] 스택 트레이스: {ex.StackTrace}"); return ("100", "세션 데이터 조회 중 오류"); } } }