using System.Text.Json; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using Back.Program.Common.Model; using Back.Program.Controllers.V1; using Back.Program.Services.V1; using Back.Program.Services.V1.Interfaces; using Back.Program.Models.APIResponses; namespace Back.Program.Controllers; [ApiController] [Route("/api/v1/out/user")] [ApiExplorerSettings(GroupName = "외부 동작(사용자)")] public class OutController: ControllerBase { private readonly ILogger _logger; private readonly IRepositoryService _repositoryService; private readonly IUserService _userService; private readonly IKakaoService _kakaoService; private readonly ISessionService _sessionService; public OutController(ILogger logger, IRepositoryService repositoryService, IUserService userService, IKakaoService kakaoService, ISessionService sessionService) { _logger = logger; _repositoryService = repositoryService; _userService = userService; _kakaoService = kakaoService; _sessionService = sessionService; } [HttpGet("kakao/auth")] [CustomOperation("카카오 로그인", "카카오 로그인 동작", "사용자")] public async Task KakaoLogin([FromQuery] string? scope, [FromQuery] string? redirectPath) { if (!string.IsNullOrEmpty(redirectPath)) { await _sessionService.SetString("redirectPath", redirectPath); } var url = await _kakaoService.GetAuthorizationUrl(scope ?? ""); Console.WriteLine($"카카오 로그인 API: {url}"); return Ok(new { url }); } [HttpGet("kakao/redirect")] public async Task RedirectFromKakao([FromQuery] string code) { var (success, response) = await _kakaoService.Redirect(code); Console.WriteLine($"리다이렉트 : {response}"); if (success) { var (idSuccess, idResponse) = await _kakaoService.UserMe(response); if (idSuccess) { var json = JsonDocument.Parse(idResponse); if (json.RootElement.TryGetProperty("id", out var idElement)) { var snsId = idElement.ToString(); Console.WriteLine($"ID = {snsId}"); var loginResult = await _userService.Login("SNS Login", "ST01", snsId); Console.WriteLine($"login = {loginResult.JsonToString()}"); if (loginResult.status.code == "000") { var data = loginResult.data as LoginAPIResponse ?? new LoginAPIResponse(); if (data != null) { string token = data.token; string refresh = data.refresh; if (await _sessionService.SetString("token", token) && await _sessionService.SetString("refresh", refresh)) { var (hasPath, redirectPath) = await _sessionService.GetString("redirectPath"); await _sessionService.Remove("redirectPath"); // 사용 후 세션에서 제거 // 로그인 성공 flag 쿠키 저장 Response.Cookies.Append("IsLogin", "true", new CookieOptions { HttpOnly = false, Secure = true, SameSite = SameSiteMode.Lax, Path = "/", Expires = DateTime.Now.AddDays(1) }); return Redirect(hasPath && !string.IsNullOrEmpty(redirectPath) ? redirectPath : "/about"); } } } else if (loginResult.status.code == "001") { if (await _sessionService.SetString("snsId", snsId)) { return Redirect("/auth/register"); } } else { return BadRequest(new { error = "로그인 실패", message = loginResult.status.message }); } } } Console.WriteLine($"ID_res = {idResponse}"); } return BadRequest(); } // // 로그아웃 API 예시 (이미 있다면 해당 위치에 추가) // [HttpGet("logout")] // public IActionResult Logout() // { // // 세션/쿠키 등 로그아웃 처리 // Response.Cookies.Delete("IsLogin"); // // 기타 로그아웃 처리 로직... // return Redirect("/"); // } }