From 6bd3869a063fd5e1519ac0aaed2fa13fe9bc8e2d Mon Sep 17 00:00:00 2001 From: dahyuun Date: Fri, 19 Aug 2022 20:01:19 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20+=20=EC=B9=9C?= =?UTF-8?q?=EA=B5=AC=EB=AA=A9=EB=A1=9D=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EA=B8=B0=20=EC=99=84=EB=A3=8C!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mbtree/controller/OAuthController.java | 97 +++++++++++++++++++ .../controller/login/LoginController.java | 94 ------------------ .../controller/login/OAuthController.java | 57 ----------- .../mbtree/mbtree/service/OAuthService.java | 29 +++++- 4 files changed, 124 insertions(+), 153 deletions(-) create mode 100644 src/main/java/com/mbtree/mbtree/controller/OAuthController.java delete mode 100644 src/main/java/com/mbtree/mbtree/controller/login/LoginController.java delete mode 100644 src/main/java/com/mbtree/mbtree/controller/login/OAuthController.java diff --git a/src/main/java/com/mbtree/mbtree/controller/OAuthController.java b/src/main/java/com/mbtree/mbtree/controller/OAuthController.java new file mode 100644 index 0000000..c669b22 --- /dev/null +++ b/src/main/java/com/mbtree/mbtree/controller/OAuthController.java @@ -0,0 +1,97 @@ +package com.mbtree.mbtree.controller; + +import com.fasterxml.jackson.databind.DatabindContext; +import com.mbtree.mbtree.config.BaseException; +import com.mbtree.mbtree.domain.user.User; +import com.mbtree.mbtree.domain.user.UserRepository; +import com.mbtree.mbtree.service.OAuthService; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.util.MultiValueMap; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + +import javax.websocket.server.PathParam; +import java.util.HashMap; + +@RestController +@AllArgsConstructor +@RequestMapping("/login") +public class OAuthController { + //코드 받아오기 + /** + * 카카오 callback + * [GET] /login/kakao/callback + */ + + + @Autowired + private OAuthService oauthService; + + + //localhost:8080/login/kakao + @ResponseBody + @GetMapping("/kakao") + public ResponseEntity kakaoCallback(@RequestParam String code) throws BaseException { + +// User user = new User(); + + System.out.println("code : " + code); + String access_Token = oauthService.getKakaoAccessToken(code); + System.out.println("controller : " + access_Token); + + HashMap userInfo = oauthService.getUserInfo(access_Token); + System.out.println("login Controller : " + userInfo); + + + String uuid = (String) userInfo.get("uuid"); + +// //TODO : OAuthService +// //userRepository에 uuid가 있는지 확인하고, 있으면 넘기고 없으면 저장 +// User user = userRepository.findByUuid(uuid); +// if(user == null) { +// //insert +// user.setUuid((String) userInfo.get("uuid")); +// user.setName((String) userInfo.get("nickname")); +// user.setToken(access_Token); +// userRepository.save(user); +// }else{ +// //update +// user.setToken(access_Token); +// userRepository.save(user); +// } + + + + return ResponseEntity.ok("사용자 정보 받아옴"); + + // 클라이언트의 이메일이 존재할 때 세션에 해당 이메일과 토큰 등록 +// if (userInfo.get("email") != null) { +// session.setAttribute("userId", userInfo.get("email")); +// session.setAttribute("access_Token", access_Token); +// } + } + + @GetMapping("/getfriends") + public Object getFriends(@PathParam(value = "access_token") String access_token){ +// oauthService.getFriends(access_token); + System.out.println("accessToken :"+access_token); + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + HttpEntity> request = new HttpEntity(headers); + ResponseEntity response; + headers.add("Authorization", "Bearer " + access_token); + + +// headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); + String redirect_uri="https://kapi.kakao.com/v1/api/talk/friends"; + + response=restTemplate.exchange(redirect_uri, HttpMethod.GET,request,String.class); + + return response; + } +} diff --git a/src/main/java/com/mbtree/mbtree/controller/login/LoginController.java b/src/main/java/com/mbtree/mbtree/controller/login/LoginController.java deleted file mode 100644 index 0695b57..0000000 --- a/src/main/java/com/mbtree/mbtree/controller/login/LoginController.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.mbtree.mbtree.controller.login; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.mbtree.mbtree.config.SecurityProperties; -import com.mbtree.mbtree.domain.user.KakaoProfile; -import com.mbtree.mbtree.domain.user.OAuthToken; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.client.RestTemplate; - -import java.util.Objects; - -@RequiredArgsConstructor -@RestController -public class LoginController { - private final ObjectMapper objectMapper; - - @PostMapping("/auth") - public KakaoProfile KakaoLogin(@RequestParam String code) { - - // 3, 4 : 인증 코드를 받은 후, 위의 파라미터들을 모두 포함해 Access 토큰 요청을 보내고 응답을 받는 코드 - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("grant_type", "authorization_code"); // 고정값 - params.add("client_id", SecurityProperties.client_id); - params.add("redirect_uri", SecurityProperties.redirect_uri); - params.add("code", code); - - // HttpHeader 오브젝트 생성 - HttpHeaders headersForAccessToken = new HttpHeaders(); - headersForAccessToken.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); - - // HttpHeader와 HttpBody를 하나의 오브젝트에 담기 - HttpEntity> kakaoTokenRequest = new HttpEntity<>(params, headersForAccessToken); - //POST방식으로 key-value 데이터를 요청(카카오쪽으로) - RestTemplate rt = new RestTemplate(); //http 요청을 간단하게 해줄 수 있는 클래스 - - // 실제로 요청하기 - // Http 요청하기 - POST 방식으로 - 그리고 response 변수의 응답을 받음. - ResponseEntity accessTokenResponse = rt.exchange( - "https://kauth.kakao.com/oauth/token", - HttpMethod.POST, - kakaoTokenRequest, - String.class - ); - - OAuthToken oauthToken = null; - try { - oauthToken = objectMapper.readValue(accessTokenResponse.getBody(), OAuthToken.class); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - - // 토큰 전달 받기 완료 - - // 5, 6, 7 : 발급받은 Access 토큰으로 API를 호출해서 사용자의 정보를 응답으로 받는 코드 - HttpHeaders headersForRequestProfile = new HttpHeaders(); - headersForRequestProfile.add("Authorization", "Bearer " + Objects.requireNonNull(oauthToken).getAccess_token()); - headersForRequestProfile.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); - - HttpEntity> kakaoResourceProfileRequest = new HttpEntity<>(headersForRequestProfile); - - // Http 요청하기 - POST 방식으로 - 그리고 response 변수의 응답을 받음. - ResponseEntity resourceProfileResponse = rt.exchange( - "https://kapi.kakao.com/v2/user/me", - HttpMethod.POST, - kakaoResourceProfileRequest, - String.class - ); - - KakaoProfile profile = null; - try { - profile = objectMapper.readValue(resourceProfileResponse.getBody(), KakaoProfile.class); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - return profile; -// User getUser = userService.getUserByEmail(profile.getKakao_account().getEmail()); -// if(getUser==null){ -// UserRequest.join joinUser = new UserRequest.join(profile.getKakao_account().getEmail(), profile.getProperties().getNickname(), "kakao"); -// userService.joinUser(joinUser); -// return ResponseEntity.ok(new JsonResponse(200,"kakaoLogin",profile)); -// }else{ -// UserRequest.login loginUser = new UserRequest.login(getUser.getEmail(),getUser.getName(),getUser.getLoginId()); -// return ResponseEntity.ok(new JsonResponse(200,"kakaoLogin",loginUser)); -// } - } -} diff --git a/src/main/java/com/mbtree/mbtree/controller/login/OAuthController.java b/src/main/java/com/mbtree/mbtree/controller/login/OAuthController.java deleted file mode 100644 index 75713f4..0000000 --- a/src/main/java/com/mbtree/mbtree/controller/login/OAuthController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.mbtree.mbtree.controller.login; - -import com.fasterxml.jackson.databind.DatabindContext; -import com.mbtree.mbtree.config.BaseException; -import com.mbtree.mbtree.domain.user.User; -import com.mbtree.mbtree.domain.user.UserRepository; -import com.mbtree.mbtree.service.OAuthService; -import lombok.AllArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; - -@RestController -@AllArgsConstructor -@RequestMapping("/login") -public class OAuthController { - //코드 받아오기 - /** - * 카카오 callback - * [GET] /login/kakao/callback - */ - - @Autowired - private UserRepository userRepository; - - @ResponseBody - @GetMapping("/kakao") - public void kakaoCallback(@RequestParam String code) throws BaseException { - - User user = new User(); - - System.out.println("code : " + code); - String access_Token = OAuthService.getKakaoAccessToken(code); - System.out.println("controller access_token : " + access_Token); - - HashMap userInfo = OAuthService.getUserInfo(access_Token); - System.out.println("login Controller : " + userInfo); - - String uuid = (String) userInfo.get("uuid"); - - - //userRepository에 uuid가 있는지 확인하고, 있으면 넘기고 없으면 저장 - if(userRepository.findByUuid(uuid) == null) { - user.setUuid((String) userInfo.get("uuid")); - user.setName((String) userInfo.get("nickname")); - userRepository.save(user); - } - - - // 클라이언트의 이메일이 존재할 때 세션에 해당 이메일과 토큰 등록 -// if (userInfo.get("email") != null) { -// session.setAttribute("userId", userInfo.get("email")); -// session.setAttribute("access_Token", access_Token); -// } - } -} diff --git a/src/main/java/com/mbtree/mbtree/service/OAuthService.java b/src/main/java/com/mbtree/mbtree/service/OAuthService.java index 0df9f38..02f0a85 100644 --- a/src/main/java/com/mbtree/mbtree/service/OAuthService.java +++ b/src/main/java/com/mbtree/mbtree/service/OAuthService.java @@ -3,6 +3,10 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonElement; +import com.mbtree.mbtree.domain.user.User; +import com.mbtree.mbtree.domain.user.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,8 +16,11 @@ import java.util.HashMap; @Service +@RequiredArgsConstructor public class OAuthService{ + private final UserRepository userRepository; + public static String getKakaoAccessToken(String code) { String access_Token = ""; String refresh_Token = ""; @@ -57,7 +64,7 @@ public static String getKakaoAccessToken(String code) { access_Token = element.getAsJsonObject().get("access_token").getAsString(); refresh_Token = element.getAsJsonObject().get("refresh_token").getAsString(); - // DB 저장 + System.out.println("access_token : " + access_Token); System.out.println("refresh_token : " + refresh_Token); @@ -70,7 +77,7 @@ public static String getKakaoAccessToken(String code) { return access_Token; } //GetUserInfo - public static HashMap getUserInfo(String access_Token) { + public HashMap getUserInfo(String access_Token) { // 요청하는 클라이언트마다 가진 정보가 다를 수 있기에 HashMap타입으로 선언 HashMap userInfo = new HashMap<>(); @@ -118,8 +125,26 @@ public static HashMap getUserInfo(String access_Token) { e.printStackTrace(); } + String uuid = (String) userInfo.get("uuid"); + //userRepository에 uuid가 있는지 확인하고, 있으면 넘기고 없으면 저장 + + User user = new User(); + if(userRepository.findByUuid(uuid) == null) { + user.setUuid((String) userInfo.get("uuid")); + user.setName((String) userInfo.get("nickname")); + user.setToken(access_Token); + userRepository.save(user); + }else{ + user = userRepository.findByUuid(uuid); + user.setToken(access_Token); + userRepository.save(user); + } + return userInfo; } + + + }