[] 사용자 API 로직 구현 (로그인, 로그아웃, 회원가입)

This commit is contained in:
김선규 2025-02-26 16:21:19 +09:00
parent 47f3b30010
commit e20ac8bdbc
2 changed files with 53 additions and 64 deletions

View File

@ -64,8 +64,7 @@ public class JwtTokenService
{
rng.GetBytes(randomNumber);
}
// return Convert.ToBase64String(randomNumber);
return new RefreshToken()
{
uid = uid,

View File

@ -40,7 +40,7 @@ public class UserController : ControllerBase
[CustomOperation("회원 정보 조회", "회원 정보 조회", "사용자")]
public IActionResult GetUserData(string uid)
{
if (string.IsNullOrEmpty(uid)) return BadRequest(APIResponse.InvalidInputError);
if (string.IsNullOrEmpty(uid)) return BadRequest(APIResponse.InvalidInputError());
try
{
@ -58,20 +58,11 @@ public class UserController : ControllerBase
})
.FirstOrDefault();
var response = new APIResponseStatus<User>
{
status = new Status
{
code = "000",
message = "정상"
},
data = user
};
return Ok(response.JsonToString());
return Ok(APIResponse.Send("000","정상",user));
}
catch (Exception ex)
{
return StatusCode(500, APIResponse.UnknownError);
return StatusCode(500, APIResponse.UnknownError());
}
}
@ -81,7 +72,7 @@ public class UserController : ControllerBase
{
// API 동작 파라미터 입력 값 확인
if (string.IsNullOrEmpty(acctype) && string.IsNullOrEmpty(sns_id))
return BadRequest(APIResponse.InvalidInputError);
return BadRequest(APIResponse.InvalidInputError());
try
{
@ -109,32 +100,23 @@ public class UserController : ControllerBase
await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
var response = new APIResponseStatus<dynamic>
return Ok(APIResponse.Send("000","정상", new
{
status = new Status
{
code = "000",
message = "정상"
},
data = new
{
token = accessToken,
refresh = refreshToken.refresh_token
}
};
return Ok(response.JsonToString());
token = accessToken,
refresh = refreshToken.refresh_token
}));
}
}
// case 1: Login 테이블에 값이 없다 == 로그인이 처음
// case 2: User 테이블에 값이 없다 == 이건 문제가 있는 상황 -> 해결은 회원가입 재 진행 시도
// Login에는 있는데 User 테이블에 없다? 말이 안되긴 하는데...
return Ok(APIResponse.Send("010", "로그인 정보가 없으므로 회원가입 진행",Empty));
return Ok(APIResponse.Send("001", "회원가입 진행: 로그인 정보가 없음",Empty));
}
catch (Exception ex)
{
_logger.LogInformation($"[로그인][에러] : {ex}");
return StatusCode(500, APIResponse.UnknownError);
return StatusCode(500, APIResponse.UnknownError());
}
}
@ -146,8 +128,7 @@ public class UserController : ControllerBase
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh))
{
var error = APIResponse.InvalidInputError;
return Ok(error);
return BadRequest(APIResponse.InvalidInputError());
}
try
@ -175,17 +156,17 @@ public class UserController : ControllerBase
catch (TokenException tokenEx)
{
_logger.LogInformation($"[로그인] : {tokenEx}");
return StatusCode(500, APIResponse.InvalidInputError);
return Ok(APIResponse.Send("001", "로그인 진행: 토큰에 문제가 있음",Empty));
}
catch (RefreshRevokeException refreshEx)
{
_logger.LogInformation($"[로그인] : {refreshEx}");
return StatusCode(500, APIResponse.InvalidInputError);
return Ok(APIResponse.Send("001", "로그인 진행: 리프레시 토큰 폐기",Empty));
}
catch (Exception ex)
{
_logger.LogInformation($"[로그인][에러] : {ex}");
return StatusCode(500, APIResponse.UnknownError);
return StatusCode(500, APIResponse.UnknownError());
}
}
@ -194,10 +175,10 @@ public class UserController : ControllerBase
[CustomOperation("회원 가입", "사용자 회원 가입", "사용자")]
public async Task<IActionResult> UserRegister([FromBody] UserAll request)
{
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError);
if (!ModelState.IsValid) return BadRequest(APIResponse.InvalidInputError());
var atIndext = request.email.IndexOf('@');
var localPartEmail = request.email.Substring(0, atIndext);
var atIndex = request.email.IndexOf('@');
var localPartEmail = request.email.Substring(0, atIndex);
var uid = $"AM{localPartEmail}{DateTime.Now:yyyyMMdd}";
var user = new User
@ -246,42 +227,51 @@ public class UserController : ControllerBase
}
// TO-DO: jwt 토큰 만들어서 여기서 보내는 작업을 해야 함
var token = _jwtTokenService.GenerateJwtToken(uid);//, "admin");
var token = _jwtTokenService.GenerateJwtToken(uid);
var refreshToken = _jwtTokenService.GenerateRefreshToken(uid);
await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
var result = new APIResponseStatus<dynamic>()
return Ok(APIResponse.Send("000","정상",new
{
status = new Status()
{
code = "000",
message = "정상"
},
data = new
{
accessToken = token,
refreshToken = refreshToken.refresh_token
}
};
return Ok(result.JsonToString());
accessToken = token,
refreshToken = refreshToken.refresh_token
}));
}
[HttpGet("logout")]
[CustomOperation("로그아웃", "사용자 로그아웃", "사용자")]
public async Task<IActionResult> LogOut(string token, string refresh) //([FromBody] UserAll request)
public async Task<IActionResult> Logout(string token, string refresh) //([FromBody] UserAll request)
{
// 로그아웃 하면 리프래시 토큰 만료 하는걸 넣어야 함
/* */
var value = await _repositoryService.ValidateToken(token, refresh);
if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(refresh)) return BadRequest(APIResponse.InvalidInputError());
// _logger.LogInformation(value.uid);
// _logger.LogInformation(value.refresh);
// _logger.LogInformation(value.token);
/* */
try
{
var validateToken = await _repositoryService.ValidateToken(token, refresh);
var refreshToken = await _dbContext.RefreshTokens.FirstOrDefaultAsync(r => r.uid == validateToken.uid);
if (refreshToken != null)
{
refreshToken.revoke_Date = DateTime.Now;
await _repositoryService.SaveData<RefreshToken, string>(refreshToken, rt => rt.uid);
return Ok(APIResponse.Send("000", "로그아웃 정상", Empty));
}
else
{
return Ok(APIResponse.Send("000", "로그아웃 정상", Empty));
}
}
catch (TokenException tokenEx)
{
return Ok(APIResponse.Send("101", "입력 받은 토큰의 문제", Empty));
}
catch (RefreshRevokeException refreshEx)
{
return Ok(APIResponse.Send("102", "폐기된 리프레시 토큰", Empty));
}
catch (Exception ex)
{
return StatusCode(500, APIResponse.UnknownError());
}
return Ok("로그아웃");
}