From 30cf152fc7b24ba7f55c6449d0437331d300a003 Mon Sep 17 00:00:00 2001 From: kim Date: Mon, 1 Feb 2021 22:31:24 +0900 Subject: [PATCH] jpablog : kakao login api - get user profile --- .../controller/api/UserApiController.java | 30 +++----- .../example/jpablog/model/KakaoProfile.java | 41 +++++++++++ .../com/example/jpablog/model/OAuthToken.java | 13 ++++ .../example/jpablog/service/KakaoLogin.java | 73 +++++++++++++++++++ .../webapp/WEB-INF/views/user/loginForm.jsp | 2 +- 5 files changed, 138 insertions(+), 21 deletions(-) create mode 100644 jpablog/src/main/java/com/example/jpablog/model/KakaoProfile.java create mode 100644 jpablog/src/main/java/com/example/jpablog/model/OAuthToken.java create mode 100644 jpablog/src/main/java/com/example/jpablog/service/KakaoLogin.java diff --git a/jpablog/src/main/java/com/example/jpablog/controller/api/UserApiController.java b/jpablog/src/main/java/com/example/jpablog/controller/api/UserApiController.java index 56f3c5eb..45c71eaa 100644 --- a/jpablog/src/main/java/com/example/jpablog/controller/api/UserApiController.java +++ b/jpablog/src/main/java/com/example/jpablog/controller/api/UserApiController.java @@ -1,8 +1,13 @@ package com.example.jpablog.controller.api; import com.example.jpablog.dto.ResponseDto; +import com.example.jpablog.model.KakaoProfile; +import com.example.jpablog.model.OAuthToken; import com.example.jpablog.model.User; +import com.example.jpablog.service.KakaoLogin; import com.example.jpablog.service.UserService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.springframework.http.*; import org.springframework.security.authentication.AuthenticationManager; @@ -45,27 +50,12 @@ public class UserApiController { @GetMapping("/auth/kakao/callback") public String kakaoCallback(String code) { // Retrofit2, OkHttp, RestTemplate, HttpsURLConnection 등이 있음 - RestTemplate rt = new RestTemplate(); - HttpHeaders headers = new HttpHeaders(); - headers.add("Content-type", "application/x-www-form-urlencoded; charset=utf-8"); + KakaoLogin kakaoLogin = new KakaoLogin(); - MultiValueMap params = new LinkedMultiValueMap<>(); - params.add("grant_type", "authorization_code"); - params.add("client_id", "e40b81f26358aa250b10a59dc8f3aa62"); - params.add("redirect_uri", "http://localhost:8080/auth/kakao/callback"); - params.add("code", code); - - HttpEntity> kakaoTokenRequest = - new HttpEntity<>(params, headers); - - ResponseEntity response = rt.exchange( - "https://kauth.kakao.com/oauth/token", - HttpMethod.POST, - kakaoTokenRequest, - String.class - ); - - return "카카오 토큰 요청 완료" + response; + OAuthToken token = kakaoLogin.getCode(code); + KakaoProfile kakaoProfile = kakaoLogin.getKakaoProfile(token); + System.out.println(kakaoProfile); + return "ㅎㅇ"; } /*// 기본 로그인 @PostMapping("/user/login") diff --git a/jpablog/src/main/java/com/example/jpablog/model/KakaoProfile.java b/jpablog/src/main/java/com/example/jpablog/model/KakaoProfile.java new file mode 100644 index 00000000..82a851e0 --- /dev/null +++ b/jpablog/src/main/java/com/example/jpablog/model/KakaoProfile.java @@ -0,0 +1,41 @@ +package com.example.jpablog.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class KakaoProfile { + public Integer id; + public String connected_at; + public Properties properties; + public KakaoAccount kakao_account; +} +@Data +class Properties { + public String nickname; + public String profile_image; + public String thumbnail_image; +} + +@Data +class KakaoAccount { + public Boolean profile_needs_agreement; + public Profile profile; + public Boolean has_email; + public Boolean email_needs_agreement; + public Boolean is_email_valid; + public Boolean is_email_verified; + public String email; +} + +@Data +class Profile { + public String nickname; + public String thumbnail_image_url; + public String profile_image_url; +} + + + diff --git a/jpablog/src/main/java/com/example/jpablog/model/OAuthToken.java b/jpablog/src/main/java/com/example/jpablog/model/OAuthToken.java new file mode 100644 index 00000000..2c989c69 --- /dev/null +++ b/jpablog/src/main/java/com/example/jpablog/model/OAuthToken.java @@ -0,0 +1,13 @@ +package com.example.jpablog.model; + +import lombok.Data; + +@Data +public class OAuthToken { + private String access_token; + private String token_type; + private String refresh_token; + private int expires_in; + private String scope; + private int refresh_token_expires_in; +} diff --git a/jpablog/src/main/java/com/example/jpablog/service/KakaoLogin.java b/jpablog/src/main/java/com/example/jpablog/service/KakaoLogin.java new file mode 100644 index 00000000..cb3ac411 --- /dev/null +++ b/jpablog/src/main/java/com/example/jpablog/service/KakaoLogin.java @@ -0,0 +1,73 @@ +package com.example.jpablog.service; + +import com.example.jpablog.model.KakaoProfile; +import com.example.jpablog.model.OAuthToken; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +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.client.RestTemplate; + +public class KakaoLogin { + + public OAuthToken getCode(String code) { + RestTemplate rt = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-type", "application/x-www-form-urlencoded; charset=utf-8"); + + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("grant_type", "authorization_code"); + params.add("client_id", "e40b81f26358aa250b10a59dc8f3aa62"); + params.add("redirect_uri", "http://localhost:8080/auth/kakao/callback"); + params.add("code", code); + + HttpEntity> kakaoTokenRequest = + new HttpEntity<>(params, headers); + + ResponseEntity response = rt.exchange( + "https://kauth.kakao.com/oauth/token", + HttpMethod.POST, + kakaoTokenRequest, + String.class + ); + // Gson, Json Simple, ObjectMapper + ObjectMapper objectMapper = new ObjectMapper(); + OAuthToken oAuthToken = null; + try { + oAuthToken = objectMapper.readValue(response.getBody(), OAuthToken.class); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return oAuthToken; + } + + public KakaoProfile getKakaoProfile(OAuthToken token) { + RestTemplate rt = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.add("Authorization", "Bearer " + token.getAccess_token()); + headers.add("Content-type", "application/x-www-form-urlencoded; charset=utf-8"); + + HttpEntity> kakaoProfileRequest = + new HttpEntity<>(headers); + + ResponseEntity response = rt.exchange( + "https://kapi.kakao.com/v2/user/me", + HttpMethod.POST, + kakaoProfileRequest, + String.class + ); + + ObjectMapper objectMapper = new ObjectMapper(); + KakaoProfile kakaoProfile = null; + try { + kakaoProfile = objectMapper.readValue(response.getBody(), KakaoProfile.class); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return kakaoProfile; + } +} diff --git a/jpablog/src/main/webapp/WEB-INF/views/user/loginForm.jsp b/jpablog/src/main/webapp/WEB-INF/views/user/loginForm.jsp index a3e03403..a04c14b4 100644 --- a/jpablog/src/main/webapp/WEB-INF/views/user/loginForm.jsp +++ b/jpablog/src/main/webapp/WEB-INF/views/user/loginForm.jsp @@ -13,7 +13,7 @@ - kakao_login_button + kakao_login_button