From 4fdb364f713db9c16456746c272996f7cd92c45d Mon Sep 17 00:00:00 2001
From: toychip <dlawnsgud427@naver.com>
Date: Wed, 29 Nov 2023 16:19:04 +0900
Subject: [PATCH] =?UTF-8?q?feat:=20CustomOAuthSuccessHandler=20redirect=20?=
 =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#7)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Member/dto/response/AuthResponse.java     |  7 ++++
 .../global/config/SecurityConfig.java         | 14 +++----
 .../api/TaveShot/global/jwt/JwtProvider.java  |  2 +
 .../oauth2/CustomOAuthSuccessHandler.java     | 40 ++++++++++++++++++-
 .../global/oauth2/GithubUserInfo.java         |  8 ++--
 5 files changed, 59 insertions(+), 12 deletions(-)
 create mode 100644 src/main/java/com/api/TaveShot/domain/Member/dto/response/AuthResponse.java

diff --git a/src/main/java/com/api/TaveShot/domain/Member/dto/response/AuthResponse.java b/src/main/java/com/api/TaveShot/domain/Member/dto/response/AuthResponse.java
new file mode 100644
index 0000000..e74596e
--- /dev/null
+++ b/src/main/java/com/api/TaveShot/domain/Member/dto/response/AuthResponse.java
@@ -0,0 +1,7 @@
+package com.api.TaveShot.domain.Member.dto.response;
+
+import lombok.Builder;
+
+@Builder
+public record AuthResponse(Long memberId, String gitLoginId, String gitProfileImageUrl) {
+}
diff --git a/src/main/java/com/api/TaveShot/global/config/SecurityConfig.java b/src/main/java/com/api/TaveShot/global/config/SecurityConfig.java
index c5a725a..8336ffa 100644
--- a/src/main/java/com/api/TaveShot/global/config/SecurityConfig.java
+++ b/src/main/java/com/api/TaveShot/global/config/SecurityConfig.java
@@ -1,8 +1,6 @@
 package com.api.TaveShot.global.config;
 
-import com.api.TaveShot.global.jwt.JwtAuthenticationFilter;
 import com.api.TaveShot.global.oauth2.CustomOAuth2UserService;
-import jakarta.servlet.Filter;
 import java.util.List;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Bean;
@@ -13,7 +11,6 @@
 import org.springframework.security.config.annotation.web.configurers.HttpBasicConfigurer;
 import org.springframework.security.config.http.SessionCreationPolicy;
 import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.web.cors.CorsConfiguration;
 
 @Configuration
@@ -53,19 +50,20 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
                 .oauth2Login()
                 .authorizationEndpoint().baseUri("/oauth/authorize")
                 .and()
-                .redirectionEndpoint().baseUri("/oauth/callback")
+                .redirectionEndpoint().baseUri("/oauth2/github/code")
                 .and()
                 .userInfoEndpoint()
                 .userService(customOAuth2UserService);
 
-        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
+//        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
 
         return http.build();
     }
 
-    private JwtAuthenticationFilter jwtAuthenticationFilter() {
-        return new JwtAuthenticationFilter();
-    }
+//    @Bean
+//    public JwtAuthenticationFilter jwtAuthenticationFilter() {
+//        return new JwtAuthenticationFilter();
+//    }
 
 
 }
diff --git a/src/main/java/com/api/TaveShot/global/jwt/JwtProvider.java b/src/main/java/com/api/TaveShot/global/jwt/JwtProvider.java
index abb282d..07e2749 100644
--- a/src/main/java/com/api/TaveShot/global/jwt/JwtProvider.java
+++ b/src/main/java/com/api/TaveShot/global/jwt/JwtProvider.java
@@ -10,7 +10,9 @@
 import java.util.Date;
 import javax.crypto.SecretKey;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
 
+@Component
 public class JwtProvider {
 
     @Value("${jwt.secret.key}")
diff --git a/src/main/java/com/api/TaveShot/global/oauth2/CustomOAuthSuccessHandler.java b/src/main/java/com/api/TaveShot/global/oauth2/CustomOAuthSuccessHandler.java
index 85909c4..9b02ffd 100644
--- a/src/main/java/com/api/TaveShot/global/oauth2/CustomOAuthSuccessHandler.java
+++ b/src/main/java/com/api/TaveShot/global/oauth2/CustomOAuthSuccessHandler.java
@@ -1,20 +1,30 @@
 package com.api.TaveShot.global.oauth2;
 
+import com.api.TaveShot.domain.Member.domain.Member;
+import com.api.TaveShot.domain.Member.dto.response.AuthResponse;
+import com.api.TaveShot.domain.Member.repository.MemberRepository;
+import com.api.TaveShot.global.jwt.JwtProvider;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
 import org.springframework.stereotype.Component;
 
-@Component
 @Slf4j
+@Component
+@RequiredArgsConstructor
 public class CustomOAuthSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
 
     private static final String REDIRECT_URL = "http://localhost:5173";
+    private final MemberRepository memberRepository;
+    private final JwtProvider jwtProvider;
 
     @Override
     public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
@@ -34,10 +44,38 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
         String profileImageUrl = githubUserInfo.getProfileImageUrl();
         String loginId = githubUserInfo.getLoginId();
         String name = githubUserInfo.getName();
+        Long gitId = githubUserInfo.getId();
 
         log.info("------------------ "
                 + "소셜 로그인 성공: " + loginId
                 + "프로필 이미지: " + profileImageUrl
                 + "이름" + name);
+
+        Member loginMember = memberRepository.findByGitId(gitId).orElseThrow(() -> new RuntimeException(""));
+        String loginMemberId = String.valueOf(loginMember.getId());
+
+        String accessToken = jwtProvider.generateAccessToken(loginMemberId);
+        // 어세스 토큰은 헤더에 담아서 응답으로 보냄
+        response.setHeader("Authorization", accessToken);
+
+        AuthResponse authResponse = AuthResponse.builder()
+                .memberId(loginMember.getId())
+                .gitLoginId(loginId)
+                .gitProfileImageUrl(profileImageUrl)
+                .build();
+
+
+        // ---------------------------------------------------------------------
+        // ToDo 아래는 임시 데이터, front와 협의 후 수정
+        String encodedMemberId = URLEncoder.encode(String.valueOf(authResponse.memberId()), StandardCharsets.UTF_8);
+        String encodedLoginId = URLEncoder.encode(authResponse.gitLoginId(), StandardCharsets.UTF_8);
+        String encodedGitProfileImageUrl = URLEncoder.encode(authResponse.gitProfileImageUrl(), StandardCharsets.UTF_8);
+
+        // 프론트엔드 페이지로 토큰과 함께 리다이렉트
+        String frontendRedirectUrl = String.format(
+                "%s/oauth2/github/code?token=%s&memberId=%s&gitLoginId=%s&profileImgUrl=%s",
+                REDIRECT_URL, accessToken, encodedMemberId, encodedLoginId, encodedGitProfileImageUrl);
+        response.sendRedirect(frontendRedirectUrl);
     }
+
 }
diff --git a/src/main/java/com/api/TaveShot/global/oauth2/GithubUserInfo.java b/src/main/java/com/api/TaveShot/global/oauth2/GithubUserInfo.java
index 50a1ef1..2decfe1 100644
--- a/src/main/java/com/api/TaveShot/global/oauth2/GithubUserInfo.java
+++ b/src/main/java/com/api/TaveShot/global/oauth2/GithubUserInfo.java
@@ -2,17 +2,15 @@
 
 import static com.api.TaveShot.global.constant.OauthConstant.AVATAR_URL_PATTERN;
 import static com.api.TaveShot.global.constant.OauthConstant.EMAIL_PATTERN;
+import static com.api.TaveShot.global.constant.OauthConstant.ID_PATTERN;
 import static com.api.TaveShot.global.constant.OauthConstant.LOGIN_PATTERN;
 import static com.api.TaveShot.global.constant.OauthConstant.NAME_PATTERN;
 
 import java.util.Map;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
-import lombok.Getter;
 
-@Getter
 @Builder
-@AllArgsConstructor
 public record GithubUserInfo(Map<String, Object> userInfo) {
 
     public String getProfileImageUrl() {
@@ -30,4 +28,8 @@ public String getName() {
     public String getMail() {
         return (String) userInfo.get(EMAIL_PATTERN);
     }
+
+    public Long getId() {
+        return (Long) userInfo.get(ID_PATTERN);
+    }
 }