diff --git a/Program/Common/JWTToken/JwtTokenService.cs b/Program/Common/JWTToken/JwtTokenService.cs index 9b610da..c771df8 100644 --- a/Program/Common/JWTToken/JwtTokenService.cs +++ b/Program/Common/JWTToken/JwtTokenService.cs @@ -17,7 +17,6 @@ namespace AcaMate.Common.Token; public class JwtTokenService { private readonly JwtSettings _jwtSettings; - private readonly ILogger _logger; public JwtTokenService(IOptions jwtSettings, ILogger logger) @@ -79,7 +78,7 @@ public class JwtTokenService /// /// 여기는 엑세스 토큰의 확인을 위한 jwt 서비스 내의 인증 메서드 /// - public ClaimsPrincipal ValidateToken(string token) + public async Task ValidateToken(string token) { if (string.IsNullOrWhiteSpace(token)) return null; var tokenHandler = new JwtSecurityTokenHandler(); @@ -101,9 +100,9 @@ public class JwtTokenService var principal = tokenHandler.ValidateToken(token, validationParameters, out var securityToken); return principal; } - catch (Exception e) + catch (Exception ex) { - Console.WriteLine($"검증 실패 {e}"); + _logger.LogError($"엑세스 토큰 오류: {ex.Message}"); return null; } diff --git a/Program/Common/Model/Status.cs b/Program/Common/Model/Status.cs index 25b8a3e..2da02a2 100644 --- a/Program/Common/Model/Status.cs +++ b/Program/Common/Model/Status.cs @@ -41,17 +41,22 @@ public static class APIResponse public static APIResponseStatus Success (){ return Send("000", "정상", ""); } - + public static APIResponseStatus InvalidInputError(string? msg = null) { return Send("100", msg ?? "입력 값이 유효하지 않습니다.", ""); } - + public static APIResponseStatus NotFoundError(string? msg = null) { return Send("200", msg ?? "알맞은 값을 찾을 수 없습니다.", ""); } + public static APIResponseStatus AccessExpireError(string? msg = null) + { + return Send("201", msg ?? "엑세스 토큰이 만료되었습니다.", ""); + } + public static APIResponseStatus InternalSeverError(string? msg = null) { return Send("300", msg ?? "통신에 오류가 발생하였습니다.", ""); diff --git a/Program/V1/Controllers/AppController.cs b/Program/V1/Controllers/AppController.cs index c77b902..897ebd0 100644 --- a/Program/V1/Controllers/AppController.cs +++ b/Program/V1/Controllers/AppController.cs @@ -2,6 +2,10 @@ using Microsoft.AspNetCore.Mvc; using System.Text.Json; using AcaMate.Common.Data; using AcaMate.Common.Models; +using AcaMate.Common.Token; +using AcaMate.V1.Models; +using AcaMate.V1.Services; +using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Version = AcaMate.V1.Models.Version; @@ -13,10 +17,16 @@ namespace AcaMate.V1.Controllers; public class AppController : ControllerBase { private readonly AppDbContext _dbContext; + private readonly ILogger _logger; + private readonly IRepositoryService _repositoryService; + private readonly JwtTokenService _jwtTokenService; - public AppController(AppDbContext dbContext) + public AppController(AppDbContext dbContext, ILogger logger, IRepositoryService repositoryService, JwtTokenService jwtTokenService) { _dbContext = dbContext; + _logger = logger; + _repositoryService = repositoryService; + _jwtTokenService = jwtTokenService; } [HttpGet("version")] @@ -69,12 +79,58 @@ public class AppController : ControllerBase [HttpGet("auth")] [CustomOperation("서버 접근 권한 확인", "서버 기능을 사용하기 위한 접근에 대해 권한 확인", "시스템")] - public async Task AuthProgram(string key) + public async Task AuthProgram([FromBody] AuthKey keys) { + string summary = String.Empty; + + try + { + summary = _repositoryService.ReadSummary(typeof(AppController), "AuthProgram"); + } + catch (Exception ex) + { + _logger.LogError($"[{summary}] : {ex.Message}"); + return StatusCode(500, APIResponse.UnknownError(ex.Message)); + } + return Ok(APIResponse.Send("000", "OK", Empty)); } + + + [HttpGet("retryAccess")] + [CustomOperation("엑세스 토큰 재발급", "액세스 토큰 재발급 동작 수행", "시스템")] + public async Task RetryAccessToken(string refresh) + { + string summary = String.Empty; + + try + { + summary = _repositoryService.ReadSummary(typeof(AppController), "AuthProgram"); + var refreshToken = await _dbContext.RefreshTokens + .FirstOrDefaultAsync(t => t.refresh_token == refresh); + if (refreshToken == null) throw new TokenException($"[{summary}] : 리프레시 토큰의 문제"); + if (refreshToken.revoke_Date < DateTime.Now) throw new TokenException($"[{summary}] : 리프레시 토큰 만료"); + if (refreshToken.expire_date < DateTime.Now) throw new TokenException($"[{summary}] : 리프레시 토큰 폐기"); + string access = _jwtTokenService.GenerateJwtToken(refreshToken.uid); + return Ok(APIResponse.Send("000", $"[{summary}], 토큰 생성 완료", + new { + access = access + })); + } + catch (TokenException ex) + { + _logger.LogError($"[{summary}] : {ex.Message}"); + return Ok(APIResponse.InvalidInputError(ex.Message)); + } + catch (Exception ex) + { + _logger.LogError($"[{summary}] : {ex.Message}"); + return StatusCode(500, APIResponse.UnknownError(ex.Message)); + } + + } - -} \ No newline at end of file +} + diff --git a/Program/V1/Controllers/PushController.cs b/Program/V1/Controllers/PushController.cs index 6619f9c..a7ec18f 100644 --- a/Program/V1/Controllers/PushController.cs +++ b/Program/V1/Controllers/PushController.cs @@ -1,4 +1,5 @@ +using System.Security.Claims; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Update.Internal; @@ -8,6 +9,7 @@ using Microsoft.AspNetCore.Http.HttpResults; using AcaMate.Common.Data; using AcaMate.V1.Services; using AcaMate.Common.Models; +using AcaMate.Common.Token; using AcaMate.V1.Models; @@ -23,14 +25,19 @@ public class PushController : ControllerBase private readonly IPushQueue _pushQueue; private readonly AppDbContext _dbContext; private readonly IRepositoryService _repositoryService; - public PushController(ILogger logger, IPushQueue pushQueue, AppDbContext dbContext, IRepositoryService repositoryService) + private readonly JwtTokenService _jwtTokenService; + public PushController(ILogger logger, IPushQueue pushQueue, AppDbContext dbContext, IRepositoryService repositoryService, JwtTokenService jwtTokenService) { _logger = logger; _pushQueue = pushQueue; _dbContext = dbContext; _repositoryService = repositoryService; + _jwtTokenService = jwtTokenService; } + // 추가 사항 + // 카테고리 별 조회 하는 부분도 추가를 할 지 고민을 해야 할 것 같음 + [HttpGet()] [CustomOperation("푸시 확인", "저장된 양식을 확인 할 수 있다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] @@ -186,22 +193,23 @@ public class PushController : ControllerBase [HttpPost("set")] [CustomOperation("푸시 변경", "저장된 양식을 변경한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task SetPush(string token, string refresh, [FromBody] DBPayload request) + public async Task SetPush(string token, [FromBody] DBPayload request) { - string uid = ""; + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); + if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; + string uid = String.Empty; - try { - + try + { if (token == "System") uid = "System"; - else { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); - - var validateToken = await _repositoryService.ValidateToken(token, refresh); - uid = validateToken.uid; + else + { + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; } - + summary = _repositoryService.ReadSummary(typeof(PushController), "SetPush"); var dbPayload = await _dbContext.DBPayload .FirstOrDefaultAsync(p => p.pid == request.pid && p.bid == request.bid); @@ -246,10 +254,12 @@ public class PushController : ControllerBase [HttpPost("create")] [CustomOperation("푸시 생성", "새로운 푸시 양식을 생성한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task CreatePush(string token, string refresh, [FromBody] CreatePush request) + public async Task CreatePush(string token, [FromBody] CreatePush request) { - string uid = ""; + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); + if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; + string uid = ""; Func randomLetter = (letters, count) => new string(Enumerable.Range(0, count).Select(_ => letters[new Random().Next(letters.Length)]).ToArray()); var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -257,15 +267,13 @@ public class PushController : ControllerBase var frontLetters = $"{randomLetter(letters, 1)}{randomLetter(digits, 1)}{randomLetter(letters, 1)}"; var afterLetters = $"{randomLetter(letters, 1)}{randomLetter(digits, 1)}{randomLetter(letters, 1)}"; - try { - + try + { if (token == "System") uid = "System"; else { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); - - var validateToken = await _repositoryService.ValidateToken(token, refresh); - uid = validateToken.uid; + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; } summary = _repositoryService.ReadSummary(typeof(PushController), "CreatePush"); @@ -327,8 +335,10 @@ public class PushController : ControllerBase [HttpDelete("delete")] [CustomOperation("푸시 삭제", "저장된 푸시 양식을 삭제 한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task DeletePush(string token, string refresh, string bid, string pid) + public async Task DeletePush(string token, string bid, string pid) { + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); + if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string uid = ""; string summary = String.Empty; @@ -336,12 +346,11 @@ public class PushController : ControllerBase { if (token == "System") uid = "System"; else { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); - - var validateToken = await _repositoryService.ValidateToken(token, refresh); - uid = validateToken.uid; + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; } + summary = _repositoryService.ReadSummary(typeof(PushController), "DeletePush"); var payload = await _dbContext.DBPayload.FirstOrDefaultAsync(p => p.bid == bid && p.pid == pid); @@ -374,21 +383,21 @@ public class PushController : ControllerBase [HttpDelete("delete/list")] [CustomOperation("사용자 푸시 목록 삭제", "사용자가 받은 푸시목록에서 푸시를 삭제한다..", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task DeleteListPush(string token, string refresh, int id) + public async Task DeleteListPush(string token, int id) { + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); + if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string uid = ""; string summary = String.Empty; - try { if (token == "System") uid = "System"; else { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); - - var validateToken = await _repositoryService.ValidateToken(token, refresh); - uid = validateToken.uid; + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; } + summary = _repositoryService.ReadSummary(typeof(PushController), "DeleteListPush"); var cabinetPush = await _dbContext.PushCabinet.FirstOrDefaultAsync(c => c.id == id); if (cabinetPush == null) return Ok(APIResponse.Send("001", $"[{summary}], 삭제 할 PUSH 없음", Empty)); @@ -420,20 +429,20 @@ public class PushController : ControllerBase [HttpPost("list")] [CustomOperation("사용자 푸시 목록 조회", "해당 사용자가 받은 푸시의 정보를 조회한다.", "푸시")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(APIResponseStatus))] - public async Task SearchToUserPush(string token, string refresh, int size, [FromBody] PushCabinet? request) + public async Task SearchToUserPush(string token, int size, [FromBody] PushCabinet? request) { + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); + if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string uid = ""; string summary = String.Empty; - + try { if (token == "System") uid = "System"; else { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError()); - if(!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); - - var validateToken = await _repositoryService.ValidateToken(token, refresh); - uid = validateToken.uid; + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; } summary = _repositoryService.ReadSummary(typeof(PushController), "SearchToUserPush"); diff --git a/Program/V1/Controllers/UserController.cs b/Program/V1/Controllers/UserController.cs index 3cafb18..e879295 100644 --- a/Program/V1/Controllers/UserController.cs +++ b/Program/V1/Controllers/UserController.cs @@ -42,20 +42,20 @@ public class UserController : ControllerBase [HttpGet] [CustomOperation("회원 정보 조회", "회원 정보 조회 (자기자신)", "사용자")] - public async Task GetUserData(string token, string refresh) + public async Task GetUserData(string token) { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) - return BadRequest(APIResponse.InvalidInputError()); + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; - try { - var validateToken = await _repositoryService.ValidateToken(token, refresh); + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + var uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; summary = _repositoryService.ReadSummary(typeof(UserController), "GetUserData"); - + var user = await _dbContext.User - .Where(u => u.uid == validateToken.uid) + .Where(u => u.uid == uid) .Select(u => new User { uid = u.uid, @@ -70,16 +70,6 @@ public class UserController : ControllerBase return Ok(APIResponse.Send("000", $"[{summary}], 정상", user)); } - catch (TokenException tokenEx) - { - _logger.LogInformation($"[{summary}] : {tokenEx}"); - return Ok(APIResponse.Send("001", $"[{summary}], 토큰에 문제가 있음", Empty)); - } - catch (RefreshRevokeException refreshEx) - { - _logger.LogInformation($"[{summary}] : {refreshEx}"); - return Ok(APIResponse.Send("001", $"[{summary}], 폐기된 리프레시 토큰", Empty)); - } catch (Exception ex) { return StatusCode(500, APIResponse.UnknownError(ex.Message)); @@ -88,21 +78,22 @@ public class UserController : ControllerBase [HttpGet("academy")] [CustomOperation("학원 리스트 확인", "사용자가 등록된 학원 리스트 확인", "사용자")] - public async Task ReadAcademyInfo(string token, string refresh) + public async Task ReadAcademyInfo(string token) { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) - return BadRequest(APIResponse.InvalidInputError()); + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; - try { - var validateToken = await _repositoryService.ValidateToken(token, refresh); + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + var uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; + summary = _repositoryService.ReadSummary(typeof(UserController), "ReadAcademyInfo"); var academies = await (from ua in _dbContext.UserAcademy join a in _dbContext.Academy on ua.bid equals a.bid - where ua.uid == validateToken.uid + where ua.uid == uid select new AcademyName { bid = a.bid, @@ -132,10 +123,10 @@ public class UserController : ControllerBase [HttpGet("login")] [CustomOperation("SNS 로그인", "로그인 후 회원이 있는지 확인", "사용자")] - public async Task Login(string acctype, string sns_id) + public async Task Login(string acctype, string snsId) { // API 동작 파라미터 입력 값 확인 - if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id)) + if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(snsId)) return BadRequest(APIResponse.InvalidInputError()); if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; @@ -145,7 +136,7 @@ public class UserController : ControllerBase summary = _repositoryService.ReadSummary(typeof(UserController), "Login"); var login = await _dbContext.Login - .FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == sns_id); + .FirstOrDefaultAsync(l => l.sns_type == acctype && l.sns_id == snsId); if (login != null) { @@ -306,21 +297,20 @@ public class UserController : ControllerBase [HttpGet("logout")] [CustomOperation("로그아웃", "사용자 로그아웃", "사용자")] - public async Task Logout(string token, string refresh) + public async Task Logout(string token) { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) - return BadRequest(APIResponse.InvalidInputError()); + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; - try { + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + var uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; + summary = _repositoryService.ReadSummary(typeof(UserController), "UserRegister"); - - // 여기서 애초에 토큰 관련 에러가 2개가 나오게 만들어져 있음 - var validateToken = await _repositoryService.ValidateToken(token, refresh); - - var refreshToken = await _dbContext.RefreshTokens.FirstOrDefaultAsync(r => r.uid == validateToken.uid); + + var refreshToken = await _dbContext.RefreshTokens.FirstOrDefaultAsync(r => r.uid == uid); if (refreshToken != null) { @@ -332,14 +322,6 @@ public class UserController : ControllerBase // 리프레시 토큰이 없다?? 그럼 이거 무조건 문제지 (이유를 알 수 없는) return Ok(APIResponse.UnknownError()); } - catch (TokenException tokenEx) - { - return Ok(APIResponse.Send("101", $"[{summary}], 입력 받은 토큰의 문제", Empty)); - } - catch (RefreshRevokeException refreshEx) - { - return Ok(APIResponse.Send("102", $"[{summary}], 폐기된 리프레시 토큰", Empty)); - } catch (Exception ex) { return StatusCode(500, APIResponse.UnknownError($"[{summary}], {ex.Message}")); @@ -349,21 +331,23 @@ public class UserController : ControllerBase [HttpGet("cancel")] [CustomOperation("회원 탈퇴", "사용자 탈퇴", "사용자")] - public async Task Cancel(string token, string refresh) + public async Task Cancel(string token) { - if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) - return BadRequest(APIResponse.InvalidInputError()); + if (string.IsNullOrEmpty(token)) return BadRequest(APIResponse.InvalidInputError()); if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError()); string summary = String.Empty; - + try { + var validateToken = await _jwtTokenService.ValidateToken(token); + if (validateToken == null) return Ok(APIResponse.AccessExpireError()); + var uid = validateToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; + summary = _repositoryService.ReadSummary(typeof(UserController), "Cancel"); // 여기서 애초에 토큰 관련 에러가 2개가 나오게 만들어져 있음 - var validateToken = await _repositoryService.ValidateToken(token, refresh); - var user = await _dbContext.User.FirstOrDefaultAsync(u => u.uid == validateToken.uid); + var user = await _dbContext.User.FirstOrDefaultAsync(u => u.uid == uid); if (user == null) return Ok(APIResponse.Send("001", $"[{summary}], 회원 정보 확인 오류", Empty)); @@ -371,7 +355,7 @@ public class UserController : ControllerBase var logUser = new LogUser { - uid = validateToken.uid, + uid = uid, create_date = DateTime.Now, create_uid = "System", log = "" @@ -388,20 +372,10 @@ public class UserController : ControllerBase returnCode = "001"; } - if (!(await _repositoryService.SaveData(logUser))) - _logger.LogError($"[{summary}] : 로그 저장 실패"); + if (!(await _repositoryService.SaveData(logUser))) _logger.LogError($"[{summary}] : 로그 저장 실패"); return Ok(APIResponse.Send(returnCode, returnMsg, Empty)); - - } - catch (TokenException tokenEx) - { - return Ok(APIResponse.Send("101", $"[{summary}], 입력 받은 토큰의 문제", Empty)); - } - catch (RefreshRevokeException refreshEx) - { - return Ok(APIResponse.Send("102", $"[{summary}], 폐기된 리프레시 토큰", Empty)); } catch (Exception ex) { diff --git a/Program/V1/Models/AuthKey.cs b/Program/V1/Models/AuthKey.cs new file mode 100644 index 0000000..2d35f7f --- /dev/null +++ b/Program/V1/Models/AuthKey.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + + +namespace AcaMate.V1.Models; + +[Table("authkey")] +public class AuthKey +{ + +} \ No newline at end of file diff --git a/Program/V1/Services/RepositoryService.cs b/Program/V1/Services/RepositoryService.cs index d4940ac..6c21503 100644 --- a/Program/V1/Services/RepositoryService.cs +++ b/Program/V1/Services/RepositoryService.cs @@ -18,7 +18,7 @@ namespace AcaMate.V1.Services; public interface IRepositoryService { - Task ValidateToken(string token, string refresh); + // Task ValidateToken(string token, string refresh); Task SaveData(T entity, Expression> key = null) where T : class; Task DeleteData(T entity, Expression> key = null) where T : class; String ReadSummary(Type type, String name); @@ -36,63 +36,61 @@ public class RepositoryService: IRepositoryService _logger = logger; _jwtTokenService = jwtTokenService; } - //토큰 태울때는 인코딩 된 걸로 태워야지 원본꺼 태우면 데이터에 손상옵니다. - /// - /// 실제로 엑세스 토큰과 리프레시 토큰으로 접근 하기 위한 메서드 - /// - public async Task ValidateToken(string token, string refresh) - { - var principalToken = _jwtTokenService.ValidateToken(token); - if (principalToken != null) - { - var uid = principalToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; - _logger.LogInformation($"토큰 변환 - {uid}"); - return new ValidateToken - { - token = token, - refresh = refresh, - uid = uid - }; - } - else - { - _logger.LogInformation("엑세스 토큰 만료"); - var refreshToken = await _dbContext.RefreshTokens - .FirstOrDefaultAsync(t => t.refresh_token == refresh); - if (refreshToken == null) - throw new TokenException("입력 받은 토큰 자체의 문제"); - - var uid = refreshToken.uid; - - if (refreshToken.revoke_Date < DateTime.Now) - throw new RefreshRevokeException("리프레시 토큰 해지"); - - if (refreshToken.expire_date > DateTime.Now) - { - _logger.LogInformation($"인증 완료 리프레시 : {uid}"); - var access = _jwtTokenService.GenerateJwtToken(uid); - - return new ValidateToken - { - token = access, - refresh = refreshToken.refresh_token, - uid = uid - }; - } - else - { - refreshToken = _jwtTokenService.GenerateRefreshToken(uid); - _logger.LogInformation("리프레시 토큰 만료"); - // await SaveData(refreshToken, rt => rt.uid); - return new ValidateToken - { - token = token, - refresh = refreshToken.refresh_token, - uid = uid - }; - } - } - } + + + // public async Task ValidateToken(string token, string refresh) + // { + // var principalToken = await _jwtTokenService.ValidateToken(token); + // if (principalToken != null) + // { + // var uid = principalToken.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? string.Empty; + // _logger.LogInformation($"토큰 변환 - {uid}"); + // return new ValidateToken + // { + // token = token, + // refresh = refresh, + // uid = uid + // }; + // } + // else + // { + // _logger.LogInformation("엑세스 토큰 만료"); + // // var refreshToken = await _dbContext.RefreshTokens + // // .FirstOrDefaultAsync(t => t.refresh_token == refresh); + // // if (refreshToken == null) + // // throw new TokenException("입력 받은 토큰 자체의 문제"); + // // + // // var uid = refreshToken.uid; + // // + // // if (refreshToken.revoke_Date < DateTime.Now) + // // throw new RefreshRevokeException("리프레시 토큰 해지"); + // // + // // if (refreshToken.expire_date > DateTime.Now) + // // { + // // _logger.LogInformation($"인증 완료 리프레시 : {uid}"); + // // var access = _jwtTokenService.GenerateJwtToken(uid); + // // + // // return new ValidateToken + // // { + // // token = access, + // // refresh = refreshToken.refresh_token, + // // uid = uid + // // }; + // // } + // // else + // // { + // // refreshToken = _jwtTokenService.GenerateRefreshToken(uid); + // // _logger.LogInformation("리프레시 토큰 만료"); + // // // await SaveData(refreshToken, rt => rt.uid); + // // return new ValidateToken + // // { + // // token = token, + // // refresh = refreshToken.refresh_token, + // // uid = uid + // // }; + // // } + // } + // } public async Task SaveData(T entity, Expression> key = null) where T : class { @@ -166,6 +164,7 @@ public class RepositoryService: IRepositoryService return false; } } + public async Task DeleteData(T entity, Expression> key = null) where T : class {