From 0ecc34853aeb348de48ec3ab7f9b392add448c70 Mon Sep 17 00:00:00 2001 From: coco3x Date: Sun, 5 Jan 2025 23:58:06 +0900 Subject: [PATCH 01/12] =?UTF-8?q?fix(main-api):=20oauth=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/SecurityConfig.java | 4 +- .../security/oauth2/ClientRegistrations.java | 8 +- ...CustomOAuth2AccessTokenResponseClient.java | 98 ------------------- .../security/oauth2/LoginFailureHandler.java | 3 +- .../security/oauth2/LoginSuccessHandler.java | 9 +- .../java/com/whoz_in/main_api/lombok.config | 1 + .../main/resources/application-main-api.yml | 3 + 7 files changed, 16 insertions(+), 110 deletions(-) delete mode 100644 modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2AccessTokenResponseClient.java create mode 100644 modules/main-api/src/main/java/com/whoz_in/main_api/lombok.config diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java index 0ec32fab..fa4a25a0 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java @@ -28,8 +28,8 @@ public class SecurityConfig { public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.securityMatcher( "/login", //TODO: 운용에선 제거 - "/oauth2/authorization/*", - "/login/oauth2/code/*" + "/oauth2/authorization/*", //소셜 로그인 페이지 (OAuth2LoginConfigurer에서 자동 생성) + "/login/oauth2/code/*" //redirect uri ); commonConfigurations(httpSecurity); diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java index f6eecf4b..eb314210 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java @@ -11,10 +11,10 @@ public class ClientRegistrations { @Value("${oauth.kakao.secret}") - private String KAKAO_SECRET; + private String kakaoSecret; @Value("${oauth.kakao.clientId}") - private String KAKAO_CLIENT_ID; + private String kakaoClientId; @Value("${oauth.redirectUri}") private String redirectUri; @@ -23,8 +23,8 @@ public ClientRegistration kakaoClientRegistration() { String providerName = SocialProvider.KAKAO.getProviderName(); return ClientRegistration.withRegistrationId(providerName) - .clientId(KAKAO_CLIENT_ID) - .clientSecret(KAKAO_SECRET) + .clientId(kakaoClientId) + .clientSecret(kakaoSecret) .redirectUri(redirectUri) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .scope("account_email", "profile_nickname", "profile_image") diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2AccessTokenResponseClient.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2AccessTokenResponseClient.java deleted file mode 100644 index e4ad8e1f..00000000 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2AccessTokenResponseClient.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.whoz_in.main_api.config.security.oauth2; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; -import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; -import org.springframework.security.oauth2.core.OAuth2AccessToken; -import org.springframework.security.oauth2.core.OAuth2AuthenticationException; -import org.springframework.security.oauth2.core.OAuth2Error; -import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; -import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -// 임시 AuthCode 로 OAuth 제공자로부터 AccessToken 을 받아오는 Client -@Component -public class CustomOAuth2AccessTokenResponseClient implements - OAuth2AccessTokenResponseClient { - - @Override - public OAuth2AccessTokenResponse getTokenResponse(OAuth2AuthorizationCodeGrantRequest request) { - RestTemplate restTemplate = new RestTemplate(); - String registrationId = request.getClientRegistration().getRegistrationId(); - - // 액세스 토큰 요청 - ResponseEntity> response = restTemplate.exchange( - request.getClientRegistration().getProviderDetails().getTokenUri(), - HttpMethod.POST, - new HttpEntity<>(createRequestBody(request), createHeaders(request)), - new ParameterizedTypeReference>() {} - ); - - // 응답 파싱 - Map tokenResponse = response.getBody(); - if (tokenResponse == null || !tokenResponse.containsKey("access_token")) { - throw new OAuth2AuthenticationException(new OAuth2Error("invalid_token_response", "Token response is invalid", null)); - } - - return handle(registrationId, tokenResponse); - } - - private OAuth2AccessTokenResponse handle(String registrationId, Map tokenResponse) { - if(registrationId==null){ - throw new IllegalArgumentException("등록되지 않은 OAuth 제공자"); - } - - // TODO: OAuth Provider 가 많아지면 Switch-Case 로 가능 - if (registrationId.equals("kakao")) { - return handleKakaoAccessTokenResponse(tokenResponse); - } - - return OAuth2AccessTokenResponse.withToken((String) tokenResponse.get("access_token")) - .tokenType(OAuth2AccessToken.TokenType.BEARER) - .expiresIn(((Number) tokenResponse.get("expires_in")).longValue()) - .refreshToken((String) tokenResponse.get("refresh_token")) - .scopes(parseScopesWithComma((String) tokenResponse.get("scope"))) - .build(); - } - - private OAuth2AccessTokenResponse handleKakaoAccessTokenResponse(Map tokenResponse) { - return OAuth2AccessTokenResponse.withToken((String) tokenResponse.get("access_token")) - .tokenType(OAuth2AccessToken.TokenType.BEARER) - .expiresIn(((Number) tokenResponse.get("expires_in")).longValue()) - .refreshToken((String) tokenResponse.get("refresh_token")) - .scopes(parseScopesWithComma((String) tokenResponse.get("scope"))) - .build(); - } - - private MultiValueMap createRequestBody(OAuth2AuthorizationCodeGrantRequest request) { - MultiValueMap formParameters = new LinkedMultiValueMap<>(); - formParameters.add("grant_type", request.getGrantType().getValue()); - formParameters.add("code", request.getAuthorizationExchange().getAuthorizationResponse().getCode()); - formParameters.add("redirect_uri", request.getClientRegistration().getRedirectUri()); - formParameters.add("client_id", request.getClientRegistration().getClientId()); - formParameters.add("client_secret", request.getClientRegistration().getClientSecret()); - return formParameters; - } - - private HttpHeaders createHeaders(OAuth2AuthorizationCodeGrantRequest request) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - return headers; - } - - private Set parseScopesWithComma(String scope) { - return scope != null ? new HashSet<>(Arrays.asList(scope.split(","))) : Collections.emptySet(); - } -} diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java index 6da94faa..59eded07 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java @@ -1,6 +1,5 @@ package com.whoz_in.main_api.config.security.oauth2; -import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @@ -13,7 +12,7 @@ public class LoginFailureHandler extends SimpleUrlAuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, - AuthenticationException exception) throws IOException, ServletException { + AuthenticationException exception) throws IOException { exception.printStackTrace(); response.sendRedirect("/login"); //TODO: Static diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java index 97f82753..86591b30 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java @@ -13,13 +13,13 @@ import com.whoz_in.main_api.shared.jwt.tokens.OAuth2TempTokenSerializer; import com.whoz_in.main_api.shared.utils.CookieFactory; import com.whoz_in.main_api.shared.utils.OAuth2UserInfoStore; -import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; import org.springframework.stereotype.Component; @@ -34,12 +34,13 @@ public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { private final OAuth2TempTokenSerializer oaUth2TempTokenSerializer; private final AccessTokenSerializer accessTokenSerializer; private final MemberRepository memberRepository; - + @Value("${frontend.base-url}") + private String frontendBaseUrl; // registered = true 일 경우, OAuth2LoginToken 을 직렬화 한 jwt 토큰 전송 // registered = false 일 경우, 추가적인 사용자 정보를 입력받아야 하므로, 임시 jwt 토큰 전송 @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException{ if (authentication.getPrincipal() instanceof OAuth2UserInfo userInfo) { if(userInfo.isRegistered()) { @@ -51,7 +52,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo addOAuth2TempTokenCookie(response, new OAuth2TempToken(userInfoKey)); } - String uri = uriBuilderFactory.uriString("/oauth/success")//TODO: Static + String uri = uriBuilderFactory.uriString( frontendBaseUrl + "/oauth/success")//TODO: Static .queryParam(IS_REGISTERED, userInfo.isRegistered()) .build() .toString(); diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/lombok.config b/modules/main-api/src/main/java/com/whoz_in/main_api/lombok.config new file mode 100644 index 00000000..53a4a723 --- /dev/null +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/lombok.config @@ -0,0 +1 @@ +lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier diff --git a/modules/main-api/src/main/resources/application-main-api.yml b/modules/main-api/src/main/resources/application-main-api.yml index 98e5c5df..adc898b2 100644 --- a/modules/main-api/src/main/resources/application-main-api.yml +++ b/modules/main-api/src/main/resources/application-main-api.yml @@ -12,6 +12,9 @@ spring: logging: config: "classpath:logback-common.xml" +frontend: + base-url: ${FRONTEND_URL} + oauth: redirectUri: ${OAUTH_REDIRECT_URL} kakao: From e677cfe876504c6b137d742ca802a5942b48ff3d Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 01:42:25 +0900 Subject: [PATCH 02/12] =?UTF-8?q?remove(main-api):=20=EC=8B=9C=ED=81=90?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=20=EA=B8=B0=EB=B3=B8=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/whoz_in/main_api/config/security/SecurityConfig.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java index fa4a25a0..deb59bf8 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java @@ -27,7 +27,7 @@ public class SecurityConfig { @Order(0) public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.securityMatcher( - "/login", //TODO: 운용에선 제거 + //"/login", //시큐리티 기본 로그인 페이지 "/oauth2/authorization/*", //소셜 로그인 페이지 (OAuth2LoginConfigurer에서 자동 생성) "/login/oauth2/code/*" //redirect uri ); @@ -38,7 +38,6 @@ public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws E httpSecurity.logout(AbstractHttpConfigurer::disable); httpSecurity.oauth2Login(oauth2-> oauth2 - //.loginPage(null) //TODO: 운영에선 추가 .clientRegistrationRepository(clientRegistrationRepositoryFactory.create()) .userInfoEndpoint(config -> config.userService(customOAuth2UserService)) .successHandler(loginSuccessHandler) From 40935c07eab53f27e25008df90a6fceff655333f Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 01:48:04 +0900 Subject: [PATCH 03/12] =?UTF-8?q?remove(main-api):=20social=20login=20?= =?UTF-8?q?=ED=95=84=EC=9A=94=20=EC=97=86=EB=8A=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main_api/config/security/SecurityConfig.java | 2 +- .../security/oauth2/CustomOAuth2UserService.java | 10 +++------- .../config/security/oauth2/response/KakaoResponse.java | 5 ----- .../security/oauth2/response/ProviderResponse.java | 1 - 4 files changed, 4 insertions(+), 14 deletions(-) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java index deb59bf8..a1d295f7 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java @@ -27,7 +27,7 @@ public class SecurityConfig { @Order(0) public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.securityMatcher( - //"/login", //시큐리티 기본 로그인 페이지 +// "/login", //시큐리티 기본 로그인 페이지 "/oauth2/authorization/*", //소셜 로그인 페이지 (OAuth2LoginConfigurer에서 자동 생성) "/login/oauth2/code/*" //redirect uri ); diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java index 022fc93f..a39acd57 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java @@ -2,6 +2,7 @@ import com.whoz_in.domain.member.MemberRepository; import com.whoz_in.domain.member.model.SocialProvider; +import com.whoz_in.domain.shared.event.EventBus; import com.whoz_in.main_api.config.security.oauth2.response.ProviderResponse; import com.whoz_in.main_api.config.security.oauth2.response.ProviderResponseFactory; import lombok.RequiredArgsConstructor; @@ -11,15 +12,14 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor @Component public class CustomOAuth2UserService extends DefaultOAuth2UserService { - - // TODO: QueryHandler 나 다른 객체로 변경 private final MemberRepository memberRepository; - private final ApplicationEventPublisher eventPublisher; + @Transactional(readOnly = true) @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { OAuth2User oAuth2User = super.loadUser(userRequest); @@ -28,12 +28,8 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic SocialProvider socialProvider = SocialProvider.findSocialProvider(providerName); ProviderResponse providerResponse = ProviderResponseFactory.create(socialProvider, oAuth2User.getAttributes()); String socialId = providerResponse.getSocialId(); - String email = providerResponse.getEmail(); // TODO: email 받아오지 않기 String name = providerResponse.getName(); boolean registered = memberRepository.existsBySocialProviderAndSocialId(socialProvider, socialId); - // TODO: 일반 회원가입으로 등록이 되었을 경우에, 카카오 로그인을 시도하면 socialProvider 정보와 socialId 값을 저장해야 함 - // 카카오톡으로부터 사용자의 실명을 가져오면? - return new OAuth2UserInfo(registered, socialProvider, socialId, name); } diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java index da9834f7..8e7aefed 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java @@ -18,11 +18,6 @@ public String getSocialId() { return attributes.get("id").toString(); } - @Override - public String getEmail() { - return kakaoAccountAttributes.get("email").toString(); - } - @SuppressWarnings("unchecked") @Override public String getName() { diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java index 3f5a2c3c..c5ca98b3 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java @@ -4,7 +4,6 @@ public interface ProviderResponse { String getSocialId(); - String getEmail(); // TODO: email 받아오지 않기 String getName(); } From 2d65f4de51a391217f8c85297171f37c73593a81 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 02:03:32 +0900 Subject: [PATCH 04/12] =?UTF-8?q?chore(main-api):=20jwt=20expiry=20?= =?UTF-8?q?=EC=9E=AC=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/main-api/src/main/resources/application-main-api.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/main-api/src/main/resources/application-main-api.yml b/modules/main-api/src/main/resources/application-main-api.yml index adc898b2..3e657bdc 100644 --- a/modules/main-api/src/main/resources/application-main-api.yml +++ b/modules/main-api/src/main/resources/application-main-api.yml @@ -24,5 +24,5 @@ oauth: jwt: secret: ${JWT_SECRET} access-token-expiry: 2h - refresh-token-expiry: 14d - oauth2-temp-token-expiry: 3m + refresh-token-expiry: 30d + oauth2-temp-token-expiry: 5m From dc8d17f06c108533728d28dca382d5a08639a8ea Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 02:42:04 +0900 Subject: [PATCH 05/12] =?UTF-8?q?chore(main-api):=20Jwt=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=83=81=EC=88=98=20=EC=A0=95=EB=A6=AC=20=EB=B0=8F?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/SecurityConfig.java | 2 +- .../oauth2/JwtAuthenticationFilter.java | 2 +- .../security/oauth2/LoginSuccessHandler.java | 7 +++---- .../consts => shared/jwt}/JwtConst.java | 18 ++++++++---------- .../whoz_in/main_api/shared/jwt/JwtUtil.java | 4 ++-- .../whoz_in/main_api/shared/jwt/TokenType.java | 8 ++++---- .../jwt/tokens/AccessTokenSerializer.java | 8 ++++---- .../jwt/tokens/OAuth2TempTokenSerializer.java | 6 +++--- .../jwt/tokens/RefreshTokenSerializer.java | 8 ++++---- .../shared/utils/OAuth2UserInfoStore.java | 6 ++++-- 10 files changed, 34 insertions(+), 35 deletions(-) rename modules/main-api/src/main/java/com/whoz_in/main_api/{config/security/consts => shared/jwt}/JwtConst.java (56%) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java index a1d295f7..fcd23b7b 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java @@ -27,7 +27,7 @@ public class SecurityConfig { @Order(0) public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.securityMatcher( -// "/login", //시큐리티 기본 로그인 페이지 + "/login", //시큐리티 기본 로그인 페이지 "/oauth2/authorization/*", //소셜 로그인 페이지 (OAuth2LoginConfigurer에서 자동 생성) "/login/oauth2/code/*" //redirect uri ); diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java index dcb6d955..26bf0be6 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java @@ -1,7 +1,7 @@ package com.whoz_in.main_api.config.security.oauth2; -import static com.whoz_in.main_api.config.security.consts.JwtConst.AUTHORIZATION; +import static com.whoz_in.main_api.shared.jwt.JwtConst.AUTHORIZATION; import com.whoz_in.main_api.shared.jwt.tokens.AccessToken; import com.whoz_in.main_api.shared.jwt.tokens.AccessTokenSerializer; diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java index 86591b30..d71681ff 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java @@ -1,8 +1,7 @@ package com.whoz_in.main_api.config.security.oauth2; -import static com.whoz_in.main_api.config.security.consts.JwtConst.ACCESS_TOKEN; -import static com.whoz_in.main_api.config.security.consts.JwtConst.IS_REGISTERED; -import static com.whoz_in.main_api.config.security.consts.JwtConst.OAUTH2_TEMP_TOKEN; +import static com.whoz_in.main_api.shared.jwt.JwtConst.ACCESS_TOKEN; +import static com.whoz_in.main_api.shared.jwt.JwtConst.OAUTH2_TEMP_TOKEN; import com.whoz_in.domain.member.MemberRepository; import com.whoz_in.domain.member.model.AccountType; @@ -53,7 +52,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo } String uri = uriBuilderFactory.uriString( frontendBaseUrl + "/oauth/success")//TODO: Static - .queryParam(IS_REGISTERED, userInfo.isRegistered()) + .queryParam("is-registered", userInfo.isRegistered()) .build() .toString(); response.sendRedirect(uri); diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/consts/JwtConst.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/JwtConst.java similarity index 56% rename from modules/main-api/src/main/java/com/whoz_in/main_api/config/security/consts/JwtConst.java rename to modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/JwtConst.java index 7e0fc29c..b8390eb9 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/consts/JwtConst.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/JwtConst.java @@ -1,5 +1,8 @@ -package com.whoz_in.main_api.config.security.consts; +package com.whoz_in.main_api.shared.jwt; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = lombok.AccessLevel.PRIVATE) public class JwtConst { // token @@ -9,18 +12,13 @@ public class JwtConst { public static final String OAUTH2_TEMP_TOKEN = "oauth2-temp-token"; public static final String TOKEN_TYPE = "token-type"; public static final String TOKEN_ID = "token-id"; - public static final String USER_INFO_KEY = "oauth-user-info-key"; - public static final String OAUTH2_TOKEN_KEY_DELIMITER = "::"; - public static final long OAUTH2_TOKEN_KEY_EXPIRATION_MIN = 3; + public static final String OAUTH_USER_INFO_KEY = "oauth-user-info-key"; + public static final String OAUTH2_TOKEN_KEY_DELIMITER = "::"; //TODO: 제거 + public static final long OAUTH2_TOKEN_KEY_EXPIRATION_MIN = 5; //TODO: 빼두기 // auth public static final String AUTHORIZATION = "Authorization"; - public static final String SOCIAL_PROVIDER = "social-provider"; - public static final String SOCIAL_ID = "social-id"; - public static final String EMAIL = "email"; - public static final String NAME = "name"; - public static final String IS_REGISTERED = "is-registered"; - public static final String USER_ID = "user-id"; + public static final String MEMBER_ID = "member-id"; public static final String ACCOUNT_TYPE = "account-type"; public static final String PERSONAL_AUTHORITY = "personal"; diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/JwtUtil.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/JwtUtil.java index e1956a99..d5f3d70e 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/JwtUtil.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/JwtUtil.java @@ -1,8 +1,8 @@ package com.whoz_in.main_api.shared.jwt; -import static com.whoz_in.main_api.config.security.consts.JwtConst.ISSUER; -import static com.whoz_in.main_api.config.security.consts.JwtConst.TOKEN_TYPE; +import static com.whoz_in.main_api.shared.jwt.JwtConst.ISSUER; +import static com.whoz_in.main_api.shared.jwt.JwtConst.TOKEN_TYPE; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/TokenType.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/TokenType.java index 5efa466b..6101f374 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/TokenType.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/TokenType.java @@ -1,8 +1,8 @@ package com.whoz_in.main_api.shared.jwt; -import static com.whoz_in.main_api.config.security.consts.JwtConst.ACCESS_TOKEN; -import static com.whoz_in.main_api.config.security.consts.JwtConst.OAUTH2_TEMP_TOKEN; -import static com.whoz_in.main_api.config.security.consts.JwtConst.REFRESH_TOKEN; +import static com.whoz_in.main_api.shared.jwt.JwtConst.ACCESS_TOKEN; +import static com.whoz_in.main_api.shared.jwt.JwtConst.OAUTH2_TEMP_TOKEN; +import static com.whoz_in.main_api.shared.jwt.JwtConst.REFRESH_TOKEN; import com.whoz_in.main_api.shared.jwt.tokens.AccessToken; import com.whoz_in.main_api.shared.jwt.tokens.OAuth2TempToken; @@ -20,7 +20,7 @@ public enum TokenType { OAUTH2_TEMP(OAuth2TempToken.class, OAUTH2_TEMP_TOKEN); private final Class tokenClass; - //TODO: 웹에 종속되었다! 더 깔끔한 방법이 없을까.. + //TODO: 토큰 타입은 쿠키를 몰라야 한다. private final String cookieName; public static TokenType findByName(String tokenTypeName){ diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/AccessTokenSerializer.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/AccessTokenSerializer.java index 9d888867..bb3c3b3e 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/AccessTokenSerializer.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/AccessTokenSerializer.java @@ -1,8 +1,8 @@ package com.whoz_in.main_api.shared.jwt.tokens; -import static com.whoz_in.main_api.config.security.consts.JwtConst.ACCOUNT_TYPE; -import static com.whoz_in.main_api.config.security.consts.JwtConst.USER_ID; +import static com.whoz_in.main_api.shared.jwt.JwtConst.ACCOUNT_TYPE; +import static com.whoz_in.main_api.shared.jwt.JwtConst.MEMBER_ID; import com.whoz_in.domain.member.model.AccountType; import com.whoz_in.domain.member.model.MemberId; @@ -22,7 +22,7 @@ public AccessTokenSerializer(JwtUtil jwtUtil, JwtProperties jwtProperties) { @Override protected AccessToken buildToken(Claims claims) { - MemberId memberId = new MemberId(UUID.fromString(claims.get(USER_ID, String.class))); + MemberId memberId = new MemberId(UUID.fromString(claims.get(MEMBER_ID, String.class))); AccountType accountType = AccountType.findAccountType(claims.get(ACCOUNT_TYPE, String.class)); return new AccessToken(memberId, accountType); } @@ -30,7 +30,7 @@ protected AccessToken buildToken(Claims claims) { @Override public Map buildClaims(AccessToken accessToken) { return Map.of( - USER_ID, accessToken.getMemberId().toString(), + MEMBER_ID, accessToken.getMemberId().toString(), ACCOUNT_TYPE, accessToken.getAccountType().toString() ); } diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/OAuth2TempTokenSerializer.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/OAuth2TempTokenSerializer.java index 69ee2020..4a601ea5 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/OAuth2TempTokenSerializer.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/OAuth2TempTokenSerializer.java @@ -1,6 +1,6 @@ package com.whoz_in.main_api.shared.jwt.tokens; -import static com.whoz_in.main_api.config.security.consts.JwtConst.USER_INFO_KEY; +import static com.whoz_in.main_api.shared.jwt.JwtConst.OAUTH_USER_INFO_KEY; import com.whoz_in.main_api.shared.jwt.JwtProperties; import com.whoz_in.main_api.shared.jwt.JwtUtil; @@ -18,7 +18,7 @@ public OAuth2TempTokenSerializer(JwtUtil jwtUtil, JwtProperties jwtProperties) { @Override protected OAuth2TempToken buildToken(Claims claims) { - String userInfoKey = claims.get(USER_INFO_KEY, String.class); + String userInfoKey = claims.get(OAUTH_USER_INFO_KEY, String.class); return new OAuth2TempToken(userInfoKey); } @@ -26,7 +26,7 @@ protected OAuth2TempToken buildToken(Claims claims) { @Override protected Map buildClaims(OAuth2TempToken jwtInfo) { return Map.of( - USER_INFO_KEY, jwtInfo.getUserInfoKey() + OAUTH_USER_INFO_KEY, jwtInfo.getUserInfoKey() ); } diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/RefreshTokenSerializer.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/RefreshTokenSerializer.java index 3d250284..c19f956d 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/RefreshTokenSerializer.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/jwt/tokens/RefreshTokenSerializer.java @@ -1,8 +1,8 @@ package com.whoz_in.main_api.shared.jwt.tokens; -import static com.whoz_in.main_api.config.security.consts.JwtConst.TOKEN_ID; -import static com.whoz_in.main_api.config.security.consts.JwtConst.USER_ID; +import static com.whoz_in.main_api.shared.jwt.JwtConst.TOKEN_ID; +import static com.whoz_in.main_api.shared.jwt.JwtConst.MEMBER_ID; import com.whoz_in.domain.member.model.MemberId; import com.whoz_in.main_api.shared.jwt.JwtProperties; @@ -22,7 +22,7 @@ public RefreshTokenSerializer(JwtUtil jwtUtil, JwtProperties jwtProperties) { @Override protected RefreshToken buildToken(Claims claims) { - MemberId memberId = new MemberId(UUID.fromString(claims.get(USER_ID, String.class))); + MemberId memberId = new MemberId(UUID.fromString(claims.get(MEMBER_ID, String.class))); UUID tokenId = UUID.fromString(claims.get(TOKEN_ID, String.class)); return new RefreshToken(memberId, tokenId); } @@ -30,7 +30,7 @@ protected RefreshToken buildToken(Claims claims) { @Override protected Map buildClaims(RefreshToken refreshToken) { return Map.of( - USER_ID, refreshToken.getMemberId().toString(), + MEMBER_ID, refreshToken.getMemberId().toString(), TOKEN_ID, refreshToken.getTokenId().toString() ); } diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/utils/OAuth2UserInfoStore.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/utils/OAuth2UserInfoStore.java index 0eefdf5a..bc76b0a3 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/utils/OAuth2UserInfoStore.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/utils/OAuth2UserInfoStore.java @@ -1,7 +1,7 @@ package com.whoz_in.main_api.shared.utils; -import static com.whoz_in.main_api.config.security.consts.JwtConst.OAUTH2_TOKEN_KEY_DELIMITER; -import static com.whoz_in.main_api.config.security.consts.JwtConst.OAUTH2_TOKEN_KEY_EXPIRATION_MIN; +import static com.whoz_in.main_api.shared.jwt.JwtConst.OAUTH2_TOKEN_KEY_DELIMITER; +import static com.whoz_in.main_api.shared.jwt.JwtConst.OAUTH2_TOKEN_KEY_EXPIRATION_MIN; import com.whoz_in.main_api.config.security.oauth2.OAuth2UserInfo; import java.security.MessageDigest; @@ -15,6 +15,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +//TODO: 패키지 변경 - OAutheTempToken과 같이 담아서 따로 관리 + // OAuth 토큰에 담을 소셜 ID 값의 Key를 저장하는 스토어 // Key : OAuth2TokenKey 의 "{hashedKey}::{expiredTime}" // Value : OAuth2UserInfo 객체 From 30b9f805443e81dd105a1661b6d7a54b18747310 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 03:09:50 +0900 Subject: [PATCH 06/12] =?UTF-8?q?comment(main-api):=20oauth2=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=84=A4=EB=AA=85=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/oauth2/CustomOAuth2UserService.java | 2 ++ .../main_api/config/security/oauth2/JwtAuthentication.java | 1 + .../config/security/oauth2/JwtAuthenticationFilter.java | 1 + .../main_api/config/security/oauth2/LoginFailureHandler.java | 1 + .../main_api/config/security/oauth2/LoginSuccessHandler.java | 1 + .../whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java | 2 +- 6 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java index a39acd57..ab8ec946 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java @@ -22,8 +22,10 @@ public class CustomOAuth2UserService extends DefaultOAuth2UserService { @Transactional(readOnly = true) @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { + //소셜 프로바이더로부터 받은 액세스 토큰을 이용하여 사용자 정보를 가져오도록 구현되어있다. OAuth2User oAuth2User = super.loadUser(userRequest); + //우리 프로젝트에서 필요한 정보로 재구성하여 반환하도록 한다. String providerName = userRequest.getClientRegistration().getRegistrationId(); SocialProvider socialProvider = SocialProvider.findSocialProvider(providerName); ProviderResponse providerResponse = ProviderResponseFactory.create(socialProvider, oAuth2User.getAttributes()); diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthentication.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthentication.java index 5c0bcfe9..47f59e85 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthentication.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthentication.java @@ -6,6 +6,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; +//SecurityContextHolder에 저장할 인증 객체로, jwt(AccessToken)로 만들어진다. @RequiredArgsConstructor public class JwtAuthentication implements Authentication { private final MemberId memberId; diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java index 26bf0be6..afa30962 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java @@ -16,6 +16,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.filter.OncePerRequestFilter; +//요청에서 jwt를 꺼내어 인증정보를 만들고 SecurityContextHolder에 넣는 필터 @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { private final AccessTokenSerializer accessTokenSerializer; diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java index 59eded07..b4b3f61f 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginFailureHandler.java @@ -7,6 +7,7 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.stereotype.Component; +//사용자가 소셜 로그인에 실패했을 경우 처리하는 핸들러 @Component public class LoginFailureHandler extends SimpleUrlAuthenticationFailureHandler { diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java index d71681ff..bdd3c0b3 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/LoginSuccessHandler.java @@ -24,6 +24,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.util.UriBuilderFactory; +//사용자가 소셜 로그인에 성공했을 경우 처리하는 핸들러 @Component @RequiredArgsConstructor public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java index 267242d6..33301cd5 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java @@ -12,7 +12,7 @@ @Getter public class OAuth2UserInfo implements OAuth2User { - private final boolean isRegistered; + private final boolean isRegistered; //후즈인에 회원가입이 되어있는지 private final SocialProvider socialProvider; private final String socialId; private final String name; From 1b62a924f8f57d0d0dd6431db09dec85290022ec Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 03:11:41 +0900 Subject: [PATCH 07/12] =?UTF-8?q?chore(main-api):=20JwtAuthentication=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20-=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/{oauth2 => }/JwtAuthentication.java | 2 +- .../config/security/{oauth2 => }/JwtAuthenticationFilter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename modules/main-api/src/main/java/com/whoz_in/main_api/config/security/{oauth2 => }/JwtAuthentication.java (95%) rename modules/main-api/src/main/java/com/whoz_in/main_api/config/security/{oauth2 => }/JwtAuthenticationFilter.java (97%) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthentication.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthentication.java similarity index 95% rename from modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthentication.java rename to modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthentication.java index 47f59e85..7ed5b52e 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthentication.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthentication.java @@ -1,4 +1,4 @@ -package com.whoz_in.main_api.config.security.oauth2; +package com.whoz_in.main_api.config.security; import com.whoz_in.domain.member.model.MemberId; import java.util.Collection; diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthenticationFilter.java similarity index 97% rename from modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java rename to modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthenticationFilter.java index afa30962..0e0805e6 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/JwtAuthenticationFilter.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthenticationFilter.java @@ -1,4 +1,4 @@ -package com.whoz_in.main_api.config.security.oauth2; +package com.whoz_in.main_api.config.security; import static com.whoz_in.main_api.shared.jwt.JwtConst.AUTHORIZATION; From cc4cca3939882e721af293acffe69f981c2915af Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 04:11:08 +0900 Subject: [PATCH 08/12] =?UTF-8?q?feat(main-api):=20security=20-=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=EC=9D=B4=20=ED=95=84=EC=9A=94=ED=95=98?= =?UTF-8?q?=EA=B1=B0=EB=82=98=20=EC=83=81=EA=B4=80=20=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=B2=B4=EC=9D=B8=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/SecurityConfig.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java index fcd23b7b..d400e806 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java @@ -4,27 +4,30 @@ import com.whoz_in.main_api.config.security.oauth2.CustomOAuth2UserService; import com.whoz_in.main_api.config.security.oauth2.LoginFailureHandler; import com.whoz_in.main_api.config.security.oauth2.LoginSuccessHandler; +import com.whoz_in.main_api.shared.jwt.tokens.AccessTokenSerializer; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.logout.LogoutFilter; @Configuration @RequiredArgsConstructor public class SecurityConfig { - private final CustomOAuth2UserService customOAuth2UserService; private final ClientRegistrationRepositoryFactory clientRegistrationRepositoryFactory; private final LoginSuccessHandler loginSuccessHandler; private final LoginFailureHandler loginFailureHandler; + private final AccessTokenSerializer accessTokenSerializer; @Bean - @Order(0) + @Order(1) public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.securityMatcher( "/login", //시큐리티 기본 로그인 페이지 @@ -47,6 +50,34 @@ public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws E return httpSecurity.build(); } + //인증이 필요하거나 인증 여부에 따라 다른 동작을 하는 메서드 + //로그아웃, 게시글 작성 등 + @Bean + @Order(3) + public SecurityFilterChain authenticationFilterChain(HttpSecurity httpSecurity) throws Exception { + httpSecurity.securityMatcher( + "/**" + ); + httpSecurity.authorizeHttpRequests(auth-> { + //인증 필요 + auth.requestMatchers(HttpMethod.POST, + "/api/v1/device" + ).authenticated(); + //인증 여부에 따라 다른 동작 +// auth.requestMatchers(HttpMethod.GET, +// ).permitAll(); + auth.anyRequest().denyAll(); + }); + + commonConfigurations(httpSecurity); + + httpSecurity.csrf(AbstractHttpConfigurer::disable); + httpSecurity.addFilterAt(new JwtAuthenticationFilter(accessTokenSerializer), LogoutFilter.class); + //TODO: 로그아웃 추가 + + return httpSecurity.build(); + } + private void commonConfigurations(HttpSecurity httpSecurity) throws Exception { httpSecurity.csrf(AbstractHttpConfigurer::disable); httpSecurity.httpBasic(AbstractHttpConfigurer::disable); From 1dfabc560b907c88787e587aba55b4c61953bec5 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 04:15:27 +0900 Subject: [PATCH 09/12] =?UTF-8?q?update(main-api):=20security=20-=20JwtAut?= =?UTF-8?q?henticationFilter=EB=A5=BC=20=EC=8A=A4=ED=94=84=EB=A7=81=20?= =?UTF-8?q?=EB=B9=88=EC=9C=BC=EB=A1=9C=20=EA=B4=80=EB=A6=AC=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/JwtAuthenticationFilter.java | 2 ++ .../config/security/SecurityConfig.java | 7 +++---- .../config/security/SecurityFilterConfig.java | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityFilterConfig.java diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthenticationFilter.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthenticationFilter.java index 0e0805e6..0b6ae271 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthenticationFilter.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/JwtAuthenticationFilter.java @@ -14,9 +14,11 @@ import lombok.RequiredArgsConstructor; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; //요청에서 jwt를 꺼내어 인증정보를 만들고 SecurityContextHolder에 넣는 필터 +@Component @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { private final AccessTokenSerializer accessTokenSerializer; diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java index d400e806..263a5c97 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java @@ -4,7 +4,6 @@ import com.whoz_in.main_api.config.security.oauth2.CustomOAuth2UserService; import com.whoz_in.main_api.config.security.oauth2.LoginFailureHandler; import com.whoz_in.main_api.config.security.oauth2.LoginSuccessHandler; -import com.whoz_in.main_api.shared.jwt.tokens.AccessTokenSerializer; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -24,7 +23,7 @@ public class SecurityConfig { private final ClientRegistrationRepositoryFactory clientRegistrationRepositoryFactory; private final LoginSuccessHandler loginSuccessHandler; private final LoginFailureHandler loginFailureHandler; - private final AccessTokenSerializer accessTokenSerializer; + private final JwtAuthenticationFilter jwtAuthenticationFilter; @Bean @Order(1) @@ -64,7 +63,7 @@ public SecurityFilterChain authenticationFilterChain(HttpSecurity httpSecurity) "/api/v1/device" ).authenticated(); //인증 여부에 따라 다른 동작 -// auth.requestMatchers(HttpMethod.GET, +// auth.requestMatchers( // ).permitAll(); auth.anyRequest().denyAll(); }); @@ -72,7 +71,7 @@ public SecurityFilterChain authenticationFilterChain(HttpSecurity httpSecurity) commonConfigurations(httpSecurity); httpSecurity.csrf(AbstractHttpConfigurer::disable); - httpSecurity.addFilterAt(new JwtAuthenticationFilter(accessTokenSerializer), LogoutFilter.class); + httpSecurity.addFilterAt(jwtAuthenticationFilter, LogoutFilter.class); //TODO: 로그아웃 추가 return httpSecurity.build(); diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityFilterConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityFilterConfig.java new file mode 100644 index 00000000..5b478447 --- /dev/null +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityFilterConfig.java @@ -0,0 +1,19 @@ +package com.whoz_in.main_api.config.security; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SecurityFilterConfig { + + // Filter를 구현한 클래스가 빈으로 등록되면 전역 필터로 동작하기 때문에 모든 요청에 대해 jwt 검증을 수행하게 됩니다. + // 따라서 필요한 경우에만 jwt 필터를 사용할 수 있도록 FilterRegistrationBean을 사용하여 전역 필터에서 제외합니다. + @Bean + public FilterRegistrationBean jwtAuthenticationFilterRegistration( + JwtAuthenticationFilter jwtAuthenticationFilter) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(jwtAuthenticationFilter); + registrationBean.setEnabled(false); + return registrationBean; + } +} From acb389c4495eab352a23fbcc5b42ee71a67b6015 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 04:22:45 +0900 Subject: [PATCH 10/12] =?UTF-8?q?update(main-api):=20=EC=9D=B4=EB=AF=B8=20?= =?UTF-8?q?=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B9=88=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EB=90=9C=20=20PasswordEncoder=EB=A5=BC=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=EB=B0=9B=EB=8F=84=EB=A1=9D=20=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main_api/shared/domain/SpringSecurityPasswordEncoder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/domain/SpringSecurityPasswordEncoder.java b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/domain/SpringSecurityPasswordEncoder.java index e1d240f6..f71934a9 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/shared/domain/SpringSecurityPasswordEncoder.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/shared/domain/SpringSecurityPasswordEncoder.java @@ -1,12 +1,14 @@ package com.whoz_in.main_api.shared.domain; import com.whoz_in.domain.member.service.PasswordEncoder; +import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Component; @Component +@RequiredArgsConstructor public class SpringSecurityPasswordEncoder implements PasswordEncoder { - private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + private final org.springframework.security.crypto.password.PasswordEncoder encoder; @Override public String encode(String plainText) { return encoder.encode(plainText); From 297f4bae89c7213fef13806e260719037a0e5b13 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 04:37:21 +0900 Subject: [PATCH 11/12] =?UTF-8?q?remove(main-api):=20oauth=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=8B=9C=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EB=8B=89=EB=84=A4=EC=9E=84,=20=EC=9D=B4=EB=A9=94=EC=9D=BC?= =?UTF-8?q?=EC=9D=84=20=EB=B0=9B=EC=A7=80=20=EC=95=8A=EC=8A=B5=EB=8B=88?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/oauth2/ClientRegistrations.java | 2 +- .../security/oauth2/CustomOAuth2UserService.java | 3 +-- .../config/security/oauth2/OAuth2UserInfo.java | 7 ++----- .../config/security/oauth2/response/KakaoResponse.java | 10 ---------- .../security/oauth2/response/ProviderResponse.java | 1 - .../main_api/shared/OAuth2UserInfoStoreTest.java | 2 +- 6 files changed, 5 insertions(+), 20 deletions(-) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java index eb314210..610b2e50 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrations.java @@ -27,7 +27,7 @@ public ClientRegistration kakaoClientRegistration() { .clientSecret(kakaoSecret) .redirectUri(redirectUri) .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) - .scope("account_email", "profile_nickname", "profile_image") + .scope("profile_image") .authorizationUri("https://kauth.kakao.com/oauth/authorize") .tokenUri("https://kauth.kakao.com/oauth/token") .userInfoUri("https://kapi.kakao.com/v2/user/me") diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java index ab8ec946..a3f3e363 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/CustomOAuth2UserService.java @@ -30,9 +30,8 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic SocialProvider socialProvider = SocialProvider.findSocialProvider(providerName); ProviderResponse providerResponse = ProviderResponseFactory.create(socialProvider, oAuth2User.getAttributes()); String socialId = providerResponse.getSocialId(); - String name = providerResponse.getName(); boolean registered = memberRepository.existsBySocialProviderAndSocialId(socialProvider, socialId); - return new OAuth2UserInfo(registered, socialProvider, socialId, name); + return new OAuth2UserInfo(registered, socialProvider, socialId); } } diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java index 33301cd5..cd59ab1c 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/OAuth2UserInfo.java @@ -15,13 +15,11 @@ public class OAuth2UserInfo implements OAuth2User { private final boolean isRegistered; //후즈인에 회원가입이 되어있는지 private final SocialProvider socialProvider; private final String socialId; - private final String name; - public OAuth2UserInfo(boolean isRegistered, SocialProvider socialProvider, String socialId, String name) { + public OAuth2UserInfo(boolean isRegistered, SocialProvider socialProvider, String socialId) { this.isRegistered = isRegistered; this.socialProvider = socialProvider; this.socialId = socialId; - this.name = name; } @Override @@ -43,8 +41,7 @@ public Collection getAuthorities() { @Override public String toString() { - String formatString = "%b-%s-%s-%s"; - return String.format(formatString, isRegistered, socialProvider, socialId, name); + return String.format("%b-%s-%s", isRegistered, socialProvider, socialId); } } diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java index 8e7aefed..c74de4ef 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/KakaoResponse.java @@ -5,24 +5,14 @@ public class KakaoResponse implements ProviderResponse{ private final Map attributes; - private final Map kakaoAccountAttributes; @SuppressWarnings("unchecked") public KakaoResponse(Map attributes) { this.attributes = attributes; - this.kakaoAccountAttributes = (Map) attributes.get("kakao_account"); } @Override public String getSocialId() { return attributes.get("id").toString(); } - - @SuppressWarnings("unchecked") - @Override - public String getName() { - // 카카오톡 프로필에 입력된 사용자의 이름 - Map profle = (Map) kakaoAccountAttributes.get("profile"); - return profle.get("nickname").toString(); - } } diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java index c5ca98b3..67c4e375 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/response/ProviderResponse.java @@ -4,6 +4,5 @@ public interface ProviderResponse { String getSocialId(); - String getName(); } diff --git a/modules/main-api/src/test/java/com/whoz_in/main_api/shared/OAuth2UserInfoStoreTest.java b/modules/main-api/src/test/java/com/whoz_in/main_api/shared/OAuth2UserInfoStoreTest.java index cff88fd9..e6678ae2 100644 --- a/modules/main-api/src/test/java/com/whoz_in/main_api/shared/OAuth2UserInfoStoreTest.java +++ b/modules/main-api/src/test/java/com/whoz_in/main_api/shared/OAuth2UserInfoStoreTest.java @@ -11,7 +11,7 @@ public class OAuth2UserInfoStoreTest { private final OAuth2TempToken testTempToken = new OAuth2TempToken("testKey"); - private final OAuth2UserInfo testValue = new OAuth2UserInfo(false, SocialProvider.KAKAO, "12345", "testUser"); + private final OAuth2UserInfo testValue = new OAuth2UserInfo(false, SocialProvider.KAKAO, "12345"); @Test @DisplayName("OAuth2UserInfo 저장/추출 테스트") From 513eeb8366fe31061a0ec64a80b9b60c1b36fe21 Mon Sep 17 00:00:00 2001 From: coco3x Date: Mon, 6 Jan 2025 04:51:16 +0900 Subject: [PATCH 12/12] =?UTF-8?q?update(main-api):=20ClientRegistrationRep?= =?UTF-8?q?ository=EB=A5=BC=20=EB=B9=88=EC=9C=BC=EB=A1=9C=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=ED=95=A9=EB=8B=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main_api/config/security/SecurityConfig.java | 6 +++--- ....java => ClientRegistrationRepositoryConfig.java} | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) rename modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/{ClientRegistrationRepositoryFactory.java => ClientRegistrationRepositoryConfig.java} (66%) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java index 263a5c97..5cf7c772 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/SecurityConfig.java @@ -1,6 +1,5 @@ package com.whoz_in.main_api.config.security; -import com.whoz_in.main_api.config.security.oauth2.ClientRegistrationRepositoryFactory; import com.whoz_in.main_api.config.security.oauth2.CustomOAuth2UserService; import com.whoz_in.main_api.config.security.oauth2.LoginFailureHandler; import com.whoz_in.main_api.config.security.oauth2.LoginSuccessHandler; @@ -13,6 +12,7 @@ import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.logout.LogoutFilter; @@ -20,7 +20,7 @@ @RequiredArgsConstructor public class SecurityConfig { private final CustomOAuth2UserService customOAuth2UserService; - private final ClientRegistrationRepositoryFactory clientRegistrationRepositoryFactory; + private final ClientRegistrationRepository clientRegistrationRepository; private final LoginSuccessHandler loginSuccessHandler; private final LoginFailureHandler loginFailureHandler; private final JwtAuthenticationFilter jwtAuthenticationFilter; @@ -40,7 +40,7 @@ public SecurityFilterChain oauth2FilterChain(HttpSecurity httpSecurity) throws E httpSecurity.logout(AbstractHttpConfigurer::disable); httpSecurity.oauth2Login(oauth2-> oauth2 - .clientRegistrationRepository(clientRegistrationRepositoryFactory.create()) + .clientRegistrationRepository(clientRegistrationRepository) .userInfoEndpoint(config -> config.userService(customOAuth2UserService)) .successHandler(loginSuccessHandler) .failureHandler(loginFailureHandler) diff --git a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrationRepositoryFactory.java b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrationRepositoryConfig.java similarity index 66% rename from modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrationRepositoryFactory.java rename to modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrationRepositoryConfig.java index cfa50304..3b88f835 100644 --- a/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrationRepositoryFactory.java +++ b/modules/main-api/src/main/java/com/whoz_in/main_api/config/security/oauth2/ClientRegistrationRepositoryConfig.java @@ -1,20 +1,20 @@ package com.whoz_in.main_api.config.security.oauth2; import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; -import org.springframework.stereotype.Component; -@Component +@Configuration @RequiredArgsConstructor -public class ClientRegistrationRepositoryFactory { - +public class ClientRegistrationRepositoryConfig { private final ClientRegistrations clientRegistrations; - public ClientRegistrationRepository create(){ + @Bean + public ClientRegistrationRepository clientRegistrationRepository(){ return new InMemoryClientRegistrationRepository( clientRegistrations.kakaoClientRegistration() ); } - }