diff --git a/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java b/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java index 7f21b7a0..a137bb9c 100644 --- a/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java +++ b/src/main/java/life/mosu/mosuserver/application/oauth/OAuthUserPersistenceProcessor.java @@ -4,6 +4,7 @@ import life.mosu.mosuserver.domain.user.entity.UserJpaEntity; import life.mosu.mosuserver.domain.user.entity.UserRole; import life.mosu.mosuserver.domain.user.repository.UserJpaRepository; +import life.mosu.mosuserver.global.exception.OAuthException; import life.mosu.mosuserver.global.processor.StepProcessor; import life.mosu.mosuserver.global.util.PhoneNumberUtil; import lombok.RequiredArgsConstructor; @@ -28,9 +29,9 @@ public UserJpaEntity process(final OAuthUserInfo info) { return userRepository.findByPhoneNumber( PhoneNumberUtil.formatPhoneNumber(info.phoneNumber())) .map(existingUser -> { -// if (existingUser.isMosuUser()) { -// throw new IllegalArgumentException("이미 모수 회원입니다."); -// } + if (existingUser.isMosuUser()) { + throw new OAuthException("DUPLICATE"); + } existingUser.updateOAuthUser( info.gender(), info.name(), diff --git a/src/main/java/life/mosu/mosuserver/global/exception/OAuthException.java b/src/main/java/life/mosu/mosuserver/global/exception/OAuthException.java new file mode 100644 index 00000000..3a831272 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/global/exception/OAuthException.java @@ -0,0 +1,10 @@ +package life.mosu.mosuserver.global.exception; + +import org.springframework.security.core.AuthenticationException; + +public class OAuthException extends AuthenticationException { + + public OAuthException(String msg) { + super(msg); + } +} 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 cee9925a..f047a66b 100644 --- a/src/main/java/life/mosu/mosuserver/global/handler/OAuth2LoginFailureHandler.java +++ b/src/main/java/life/mosu/mosuserver/global/handler/OAuth2LoginFailureHandler.java @@ -6,7 +6,6 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; 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.security.core.AuthenticationException; @@ -27,8 +26,11 @@ public class OAuth2LoginFailureHandler implements public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { - LoginResponse loginResponse = LoginResponse.from(); - String jsonResponse = UriUtils.encode(objectMapper.writeValueAsString(loginResponse), + OAuthErrorType errorType = OAuthErrorType.from(exception.getMessage()); + OAuthFailureResponse oAuthFailureResponse = OAuthFailureResponse.from( + errorType.getMessage()); + + String jsonResponse = UriUtils.encode(objectMapper.writeValueAsString(oAuthFailureResponse), StandardCharsets.UTF_8); final String redirectWithAccessToken = UriComponentsBuilder.fromUriString( diff --git a/src/main/java/life/mosu/mosuserver/global/handler/OAuthErrorType.java b/src/main/java/life/mosu/mosuserver/global/handler/OAuthErrorType.java new file mode 100644 index 00000000..9ae0e07a --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/global/handler/OAuthErrorType.java @@ -0,0 +1,27 @@ +package life.mosu.mosuserver.global.handler; + +import lombok.Getter; + +@Getter +public enum OAuthErrorType { + CANCELED("CANCELED"), + DUPLICATE("DUPLICATE"), + UNKNOWN("UNKNOWN"); + + private final String message; + + OAuthErrorType(String message) { + this.message = message; + } + + public static OAuthErrorType from(String text) { + if (text == null) { + return UNKNOWN; + } + return switch (text) { + case "DUPLICATE" -> DUPLICATE; + case "[access_denied] User denied access" -> CANCELED; + default -> UNKNOWN; + }; + } +} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/global/handler/OAuthFailureResponse.java b/src/main/java/life/mosu/mosuserver/global/handler/OAuthFailureResponse.java new file mode 100644 index 00000000..7af100e0 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/global/handler/OAuthFailureResponse.java @@ -0,0 +1,11 @@ +package life.mosu.mosuserver.global.handler; + +public record OAuthFailureResponse( + Boolean isProfileRegistered, + String errorCode +) { + + public static OAuthFailureResponse from(String errorCode) { + return new OAuthFailureResponse(null, errorCode); + } +} 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 7f206fe4..4f9f35ef 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,8 +21,4 @@ public static LoginResponse from(Boolean isProfileRegistered, final UserJpaEntit } return new LoginResponse(false, LoginUserResponse.from(user)); } - - public static LoginResponse from() { - return new LoginResponse(null, null); - } }