forked from AcaMate/AcaMate_API
76 lines
3.1 KiB
C#
76 lines
3.1 KiB
C#
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<DedicateWeb> _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<JsonElement>(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", "세션 데이터 조회 중 오류");
|
|
}
|
|
}
|
|
} |