From 4db550633320eb4f033820e0e541aba4b865b00d Mon Sep 17 00:00:00 2001 From: wlgns12370 Date: Mon, 11 Aug 2025 08:54:57 +0900 Subject: [PATCH] MOSU refactor: enhance OAuth2 login failure handling with redirect and JSON response --- .../handler/OAuth2LoginFailureHandler.java | 40 ++++++------------- .../auth/dto/request/LoginResponse.java | 4 ++ 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/main/java/life/mosu/mosuserver/global/handler/OAuth2LoginFailureHandler.java b/src/main/java/life/mosu/mosuserver/global/handler/OAuth2LoginFailureHandler.java index f2c26ea3..cee9925a 100644 --- a/src/main/java/life/mosu/mosuserver/global/handler/OAuth2LoginFailureHandler.java +++ b/src/main/java/life/mosu/mosuserver/global/handler/OAuth2LoginFailureHandler.java @@ -5,16 +5,15 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import life.mosu.mosuserver.global.exception.ErrorResponse; +import java.nio.charset.StandardCharsets; +import life.mosu.mosuserver.presentation.auth.dto.request.LoginResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.core.OAuth2AuthenticationException; -import org.springframework.security.oauth2.core.OAuth2Error; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; +import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.UriUtils; @Slf4j @Component @@ -28,29 +27,16 @@ public class OAuth2LoginFailureHandler implements public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { - String errorCode = "UNKNOWN_ERROR"; - String errorMessage = "로그인에 실패했습니다. 관리자에게 문의하세요."; + LoginResponse loginResponse = LoginResponse.from(); + String jsonResponse = UriUtils.encode(objectMapper.writeValueAsString(loginResponse), + StandardCharsets.UTF_8); - if (exception instanceof OAuth2AuthenticationException oAuth2Ex) { - OAuth2Error error = oAuth2Ex.getError(); - errorCode = error.getErrorCode(); - errorMessage = error.getDescription() != null ? error.getDescription() : errorCode; + final String redirectWithAccessToken = UriComponentsBuilder.fromUriString( + "https://www.mosuedu.com/auth/kakao/redirect") + .queryParam("data", jsonResponse) + .build() + .toUriString(); - log.info("OAuth2 Error: {}, Description: {}", error.getErrorCode(), - error.getDescription()); - } - - ErrorResponse errorResponse = ErrorResponse.builder() - .status(HttpStatus.UNAUTHORIZED.value()) - .message("인증에 실패했습니다") - .errors(errorMessage) - .code(errorCode) - .build(); - - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.setContentType("application/json;charset=UTF-8"); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - - objectMapper.writeValue(response.getWriter(), errorResponse); + response.sendRedirect(redirectWithAccessToken); } } diff --git a/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/LoginResponse.java b/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/LoginResponse.java index 4f9f35ef..7f206fe4 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/LoginResponse.java +++ b/src/main/java/life/mosu/mosuserver/presentation/auth/dto/request/LoginResponse.java @@ -21,4 +21,8 @@ public static LoginResponse from(Boolean isProfileRegistered, final UserJpaEntit } return new LoginResponse(false, LoginUserResponse.from(user)); } + + public static LoginResponse from() { + return new LoginResponse(null, null); + } }