From 8e849e728aa6da009e949e6b4f729c97da88493f Mon Sep 17 00:00:00 2001 From: MeangSung Date: Mon, 10 Jun 2024 12:13:48 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=84=AC=EB=84=A4=EC=9D=BC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F,=20kakaoproxy=20=EC=84=A4=EC=A0=95=20client5=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++ .../domain/entity/member/Member.java | 4 ++ .../security/service/KaKaoLoginService.java | 46 +++++++++++++------ .../config/ElasticsearchConfig.java | 2 + 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index ac54148f..7ec44c84 100644 --- a/build.gradle +++ b/build.gradle @@ -67,6 +67,9 @@ dependencies { //actuator implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-registry-prometheus' + + implementation group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.2' + } def generated = 'src/main/generated' diff --git a/src/main/java/kcs/funding/fundingboost/domain/entity/member/Member.java b/src/main/java/kcs/funding/fundingboost/domain/entity/member/Member.java index bcaabf89..4eb09fb0 100644 --- a/src/main/java/kcs/funding/fundingboost/domain/entity/member/Member.java +++ b/src/main/java/kcs/funding/fundingboost/domain/entity/member/Member.java @@ -96,4 +96,8 @@ public void minusPoint(int usingPoint) { public void plusPoint(int exchangePoint) { point += exchangePoint; } + + public void changeProfileImgUrl(String newProfileImgUrl) { + this.profileImgUrl = newProfileImgUrl; + } } diff --git a/src/main/java/kcs/funding/fundingboost/domain/security/service/KaKaoLoginService.java b/src/main/java/kcs/funding/fundingboost/domain/security/service/KaKaoLoginService.java index 64369bb7..e671961f 100644 --- a/src/main/java/kcs/funding/fundingboost/domain/security/service/KaKaoLoginService.java +++ b/src/main/java/kcs/funding/fundingboost/domain/security/service/KaKaoLoginService.java @@ -23,9 +23,12 @@ import kcs.funding.fundingboost.domain.security.entity.KakaoOAuthToken; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.HttpHost; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; -import org.springframework.http.client.JdkClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; @@ -55,14 +58,19 @@ public class KaKaoLoginService { * 카카오 서버에서 인증 토큰을 받아오는 메소드 */ public String getAccessTokenFromKakao(String clientId, String code) throws IOException { + // 프록시 설정 + HttpHost proxy = new HttpHost("krmp-proxy.9rum.cc", "http", 3128); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + HttpClient httpClient = HttpClients.custom().setProxy(proxy).build(); + requestFactory.setHttpClient(httpClient); // KAKAO 서버에 인증 토큰 발급 요청 RestClient restClient = RestClient.builder() - .requestFactory(new JdkClientHttpRequestFactory()) + .requestFactory(requestFactory) .messageConverters(convert -> convert.add(new AllEncompassingFormHttpMessageConverter())) .baseUrl("https://kauth.kakao.com/oauth/token") .build(); - //토큰 요청에 들어갈 body + // 토큰 요청에 들어갈 body MultiValueMap objectMaping = new LinkedMultiValueMap<>(); objectMaping.add("grant_type", "authorization_code"); objectMaping.add("client_id", clientId); @@ -70,7 +78,7 @@ public String getAccessTokenFromKakao(String clientId, String code) throws IOExc objectMaping.add("code", code); objectMaping.add("client_secret", clientSecret); - //카카오 서버로 post 토큰요청 + // 카카오 서버로 post 토큰요청 ResponseEntity response = restClient.post() .body(objectMaping) .contentType(APPLICATION_FORM_URLENCODED) @@ -80,21 +88,26 @@ public String getAccessTokenFromKakao(String clientId, String code) throws IOExc if (response.getBody() == null) { throw new OAuth2AuthenticationException("Invalid authorization code"); } - //토큰 발췌 + // 토큰 발췌 String accessToken = response.getBody().access_token(); String refreshToken = response.getBody().refresh_token(); return accessToken; - } + /** * 토큰으로 사용자 정보 요청 후 인증, access token 및 refresh token 발행 */ public JwtDto getJwtDto(String accessToken) throws IOException { + // 프록시 설정 + HttpHost proxy = new HttpHost("krmp-proxy.9rum.cc", "http", 3128); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + HttpClient httpClient = HttpClients.custom().setProxy(proxy).build(); + requestFactory.setHttpClient(httpClient); // kakao 서버에 access token으로 사용자 정보 요청 RestClient restClient = RestClient.builder() - .requestFactory(new JdkClientHttpRequestFactory()) + .requestFactory(requestFactory) .messageConverters(convert -> convert.add(new AllEncompassingFormHttpMessageConverter())) .baseUrl("https://kapi.kakao.com/v2/user/me") .build(); @@ -126,24 +139,25 @@ public JwtDto getJwtDto(String accessToken) throws IOException { * 개인정보 저장 및 친구목록 업데이트 */ private CustomUserDetails processLoginAndRelationships(KakaoOAuth2User kakaoOAuth2User, String accessToken) { - String provider = "kakao"; - String providerId = kakaoOAuth2User.getId(); String username = kakaoOAuth2User.getName(); - String password = passwordEncoder.encode(provider + "_" + providerId); + String password = passwordEncoder.encode("string"); String email = kakaoOAuth2User.getEmail(); String profileImgUrl = kakaoOAuth2User.getImageUrl(); - String uuid = kakaoOAuth2User.getAttribute("id").toString(); + String kakao_id = "kakao_" + kakaoOAuth2User.getAttribute("id").toString(); Member findMember = memberRepository.findByEmail(email).orElse(null); String friendsList = getFriendsListByKakao(accessToken); CustomUserDetails customUserDetails; if (findMember == null) { - Member createMember = Member.createMember(username, email, password, profileImgUrl, uuid); + Member createMember = Member.createMember(username, email, password, profileImgUrl, kakao_id); customUserDetails = new CustomUserDetails(kakaoOAuth2User.getAttributes(), createMember); memberRepository.save(createMember); processFirstRelationships(friendsList, createMember); } else { + if (findMember.getProfileImgUrl() != profileImgUrl) { + findMember.changeProfileImgUrl(profileImgUrl); + } customUserDetails = new CustomUserDetails(kakaoOAuth2User.getAttributes(), findMember); processRelationships(friendsList, findMember); } @@ -220,8 +234,14 @@ private void processFirstRelationships(String friendsList, Member member) { * 카카오로부터 친구목록 가져오기 */ private static String getFriendsListByKakao(String accessToken) { + // 프록시 설정 + HttpHost proxy = new HttpHost("krmp-proxy.9rum.cc", "http", 3128); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + HttpClient httpClient = HttpClients.custom().setProxy(proxy).build(); + requestFactory.setHttpClient(httpClient); + RestClient restClient = RestClient.builder() - .requestFactory(new JdkClientHttpRequestFactory()) + .requestFactory(requestFactory) .messageConverters(converter -> converter.add(new AllEncompassingFormHttpMessageConverter())) .baseUrl("https://kapi.kakao.com/v1/api/talk/friends") .build(); diff --git a/src/main/java/kcs/funding/fundingboost/elasticsearch/config/ElasticsearchConfig.java b/src/main/java/kcs/funding/fundingboost/elasticsearch/config/ElasticsearchConfig.java index 2d7d3520..2148d27d 100644 --- a/src/main/java/kcs/funding/fundingboost/elasticsearch/config/ElasticsearchConfig.java +++ b/src/main/java/kcs/funding/fundingboost/elasticsearch/config/ElasticsearchConfig.java @@ -23,6 +23,8 @@ public class ElasticsearchConfig { @Bean public RestClient restClient() { + org.apache.hc.core5.http.HttpHost httpHost = new org.apache.hc.core5.http.HttpHost(host, port); + return RestClient .builder(new HttpHost(host, port, "http")) .build();