Skip to content

Commit

Permalink
feat: CustomOAuthSuccessHandler redirect 구현 (#7)
Browse files Browse the repository at this point in the history
  • Loading branch information
toychip committed Nov 29, 2023
1 parent 47eea6e commit 4fdb364
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -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) {
}
14 changes: 6 additions & 8 deletions src/main/java/com/api/TaveShot/global/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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();
// }


}
2 changes: 2 additions & 0 deletions src/main/java/com/api/TaveShot/global/jwt/JwtProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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);
}
}

0 comments on commit 4fdb364

Please sign in to comment.