From fa1b4d1b2c92660ddb362c35919f33444322f8ea Mon Sep 17 00:00:00 2001 From: yunrry Date: Fri, 15 Aug 2025 00:53:12 +0900 Subject: [PATCH 1/2] fix : redirect url --- .../usecase/OAuth2AuthenticationUseCase.java | 21 +++++++++---- .../airo/security/config/SecurityConfig.java | 5 ++++ .../filter/JwtAuthenticationFilter.java | 3 ++ .../OAuth2AuthenticationSuccessHandler.java | 30 +++++++++++++++++-- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/main/java/backend/airo/application/auth/oauth2/usecase/OAuth2AuthenticationUseCase.java b/src/main/java/backend/airo/application/auth/oauth2/usecase/OAuth2AuthenticationUseCase.java index cb2d11b..c88db46 100644 --- a/src/main/java/backend/airo/application/auth/oauth2/usecase/OAuth2AuthenticationUseCase.java +++ b/src/main/java/backend/airo/application/auth/oauth2/usecase/OAuth2AuthenticationUseCase.java @@ -4,6 +4,7 @@ import backend.airo.domain.auth.oauth2.query.FindOAuth2UserQuery; import backend.airo.domain.user.User; import backend.airo.domain.user.enums.ProviderType; +import backend.airo.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -34,12 +35,16 @@ public class OAuth2AuthenticationUseCase { @Value("${app.oauth2.failure-url:https://site-navy-six-67.vercel.app/auth/nickname}") private String failureUrl; - public String handleAuthenticationSuccess(OAuth2User oauth2User, String accessToken) { + private String localSuccessBaseUrl = "http://localhost:5173/auth/success"; + + private String localFailureUrl = "http://localhost:5173/auth/nickname"; + + public String handleAuthenticationSuccess(OAuth2User oauth2User, String accessToken, boolean isLocalClient) { // 1. OAuth2 정보 추출 String providerId = oauth2User.getAttribute("provider_id"); ProviderType providerType = oauth2User.getAttribute("provider_type"); - log.info("Provider ID: {}, Provider Type: {}", providerId, providerType); + log.info("Provider ID: {}, Provider Type: {}, Local Client: {}", providerId, providerType, isLocalClient); // 2. 사용자 조회 Optional userOptional = findOAuth2UserQuery.findByProviderIdAndType(providerId, providerType); @@ -51,14 +56,18 @@ public String handleAuthenticationSuccess(OAuth2User oauth2User, String accessTo // 3. 토큰 저장 generateTempCodeCommand.generate(user.getId(), accessToken); - // 4. 성공 URL 반환 - return successBaseUrl + "?token=" + accessToken; + // 4. 환경에 따른 성공 URL 반환 + String baseUrl = isLocalClient ? localSuccessBaseUrl : successBaseUrl; + return baseUrl + "?token=" + accessToken; } else { - log.warn("사용자를 찾을 수 없음 - Provider ID: {}, Provider Type: {}", providerId, providerType); + log.warn("사용자를 찾을 수 없음 - 새로운유저 생성 Provider ID: {}, Provider Type: {}", providerId, providerType); // OAuth2User 속성들을 Redis에 저장 saveOAuth2UserToRedis(accessToken, oauth2User); - return failureUrl + "?token=" + accessToken; + + // 환경에 따른 실패 URL 반환 + String baseUrl = isLocalClient ? localFailureUrl : failureUrl; + return baseUrl + "?token=" + accessToken; } } diff --git a/src/main/java/backend/airo/security/config/SecurityConfig.java b/src/main/java/backend/airo/security/config/SecurityConfig.java index 530e812..0706f05 100644 --- a/src/main/java/backend/airo/security/config/SecurityConfig.java +++ b/src/main/java/backend/airo/security/config/SecurityConfig.java @@ -53,6 +53,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti "/api-docs/**", "/swagger-resources/**", "/webjars/**", + "/api/auth/oauth2/**", "/api/auth/**", "/api/oauth2/**", "/api/login", @@ -72,9 +73,13 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti ).permitAll() .anyRequest().authenticated() ) + .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .oauth2Login(oauth2 -> oauth2 + .authorizationEndpoint(authorization -> authorization + .baseUri("/api/auth/oauth2/authorization") + ) .userInfoEndpoint(userInfo -> userInfo .userService(customOAuth2UserService) ) diff --git a/src/main/java/backend/airo/security/filter/JwtAuthenticationFilter.java b/src/main/java/backend/airo/security/filter/JwtAuthenticationFilter.java index b00fca7..2bfa25a 100644 --- a/src/main/java/backend/airo/security/filter/JwtAuthenticationFilter.java +++ b/src/main/java/backend/airo/security/filter/JwtAuthenticationFilter.java @@ -92,6 +92,9 @@ protected boolean shouldNotFilter(HttpServletRequest request) { path.startsWith("/api/v1/init/") || path.startsWith("/v3/api-docs/") || path.startsWith("/api/login/oauth2/") || + path.startsWith("/api/login") || + path.startsWith("/api/auth/oauth2/") || + path.startsWith("/api/auth/oauth2/authorization/kakao") || path.startsWith("/login/oauth2/"); log.info("필터 실행 여부 체크 - URI: {}, 스킵: {}", path, shouldSkip); diff --git a/src/main/java/backend/airo/security/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/backend/airo/security/handler/OAuth2AuthenticationSuccessHandler.java index b6fd109..77587b1 100644 --- a/src/main/java/backend/airo/security/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/backend/airo/security/handler/OAuth2AuthenticationSuccessHandler.java @@ -41,8 +41,12 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo OAuth2User oauth2User = (OAuth2User) authentication.getPrincipal(); log.info("OAuth2User 정보: {}", oauth2User.getAttributes()); - // UseCase로 인증 처리 위임 - String redirectUrl = oauth2AuthenticationUseCase.handleAuthenticationSuccess(oauth2User, accessToken); + // 클라이언트 환경 확인 + boolean isLocalClient = isLocalClient(request); + log.info("로컬 클라이언트 여부: {}", isLocalClient); + + // UseCase로 인증 처리 위임 (환경 정보 전달) + String redirectUrl = oauth2AuthenticationUseCase.handleAuthenticationSuccess(oauth2User, accessToken, isLocalClient); log.info("리다이렉트 URL: {}", redirectUrl); response.sendRedirect(redirectUrl); @@ -54,4 +58,26 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo response.sendRedirect("/auth/failure"); } } + + private boolean isLocalClient(HttpServletRequest request) { + // Referer 헤더로 클라이언트 확인 + String referer = request.getHeader("Referer"); + if (referer != null && referer.contains("localhost:5173")) { + return true; + } + + // Origin 헤더로 클라이언트 확인 + String origin = request.getHeader("Origin"); + if (origin != null && origin.contains("localhost:5173")) { + return true; + } + + // Host 헤더로 확인 (프록시 환경 고려) + String host = request.getHeader("Host"); + if (host != null && host.contains("localhost:5173")) { + return true; + } + + return false; + } } \ No newline at end of file From b01d608f510d63594d2263bcc1ec9fe538e871a8 Mon Sep 17 00:00:00 2001 From: yunrry Date: Fri, 15 Aug 2025 13:07:27 +0900 Subject: [PATCH 2/2] local setting of oauth redirect --- .DS_Store | Bin 0 -> 6148 bytes .../security/CustomAuthenticationEntryPoint.java | 10 ++++++++++ .../airo/security/config/SecurityConfig.java | 3 --- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .oauth2Login(oauth2 -> oauth2 - .authorizationEndpoint(authorization -> authorization - .baseUri("/api/auth/oauth2/authorization") - ) .userInfoEndpoint(userInfo -> userInfo .userService(customOAuth2UserService) )