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 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); + } }