FIF's 코딩팩토리

Spring MVC 카카오 아이디로 로그인(REST API) 본문

Back-End/Java(자바)

Spring MVC 카카오 아이디로 로그인(REST API)

FIF 2019. 6. 28. 18:33
반응형

https://developers.kakao.com/

 

Kakao Developers_

더 나은 세상을 꿈꾸고 그것을 현실로 만드는 이를 위하여 카카오에서 앱 개발 플랫폼 서비스를 시작합니다.

developers.kakao.com

 카카오디벨로퍼 사이트 들어간 후 로그인

 

 

 

카카오계정 로그인 클릭

 

 

앱 개발 시작하기 클릭

 

 

 

좌측에 앱만들기 클릭

 

 

앱 이름과 회사명 설정 후, 

 

계속 진행 클릭

 

 

앱을 만든 후, REST API키를 메모장같은곳에 복사해 두자

 

 

 

좌측에 자기가 만든 어플리케이션에 들어간다.

 

 

이런식으로 사용불가가 뜰텐데, 사용자 관리에 들어가서 기본 설정을 해주어야 한다.

 

 

OFF돼있는걸 클릭해서 ON으로 바꾸자.

 

 

 

필요한 항목 체크하고, 저장을 누른다. 수집목적은 적당하게 써준다.

 

 

 

앱 정보 설정을 누른다.

 

 

웹 설정을 누른후, 사이트 도미엔과 Redirect Path를 설정한다.

이것도 메모장에 적어두자.

코딩할때 쓰이니까.

 

 

 

  private final static String K_CLIENT_ID = "자기꺼 REST API키 복붙";
                                              //이런식으로 REDIRECT_URI를 써넣는다.                                                                                                  //                                                //
   private final static String K_REDIRECT_URI = "http://localhost:8080/myfinal/kakaologin.do";

   public static String getAuthorizationUrl(HttpSession session) {
      String kakaoUrl = "https://kauth.kakao.com/oauth/authorize?" + "client_id=" + K_CLIENT_ID + "&redirect_uri="
            + K_REDIRECT_URI + "&response_type=code";
      return kakaoUrl;
   }


public static JsonNode getAccessToken(String autorize_code) {
      final String RequestUrl = "https://kauth.kakao.com/oauth/token";
      final List<NameValuePair> postParams = new ArrayList<NameValuePair>();
      postParams.add(new BasicNameValuePair("grant_type", "authorization_code"));
      postParams.add(new BasicNameValuePair("client_id", "자기꺼REST API KEY복붙")); // REST API KEY
      postParams.add(new BasicNameValuePair("redirect_uri", "http://localhost:8080/myfinal/kakaologin.do")); // 리다이렉트 URI                                                              
      postParams.add(new BasicNameValuePair("code", autorize_code)); // 로그인 과정중 얻은 code 값
      final HttpClient client = HttpClientBuilder.create().build();
      final HttpPost post = new HttpPost(RequestUrl);
      JsonNode returnNode = null;
      try {
         post.setEntity(new UrlEncodedFormEntity(postParams));
         final HttpResponse response = client.execute(post);
         // JSON 형태 반환값 처리
         ObjectMapper mapper = new ObjectMapper();
         returnNode = mapper.readTree(response.getEntity().getContent());
      } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
      } catch (ClientProtocolException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         // clear resources
      }
      return returnNode;
   }
   
   public static JsonNode getKakaoUserInfo(JsonNode accessToken) {
      final String RequestUrl = "https://kapi.kakao.com/v2/user/me";
      final HttpClient client = HttpClientBuilder.create().build();
      final HttpPost post = new HttpPost(RequestUrl);
      // add header
      post.addHeader("Authorization", "Bearer " + accessToken);
      JsonNode returnNode = null;
      try {
         final HttpResponse response = client.execute(post);
         // JSON 형태 반환값 처리
         ObjectMapper mapper = new ObjectMapper();
         returnNode = mapper.readTree(response.getEntity().getContent());
      } catch (ClientProtocolException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         // clear resources
      }
      return returnNode;
   }

KakaoController라는 이름으로 클래스를 하나만들고, 자기꺼 REST API키를 해당하는 곳에 붙여넣기 한다.

 

 

 

나는 이런식으로 로그인창을 구현했다.

 

        <div id="kakao_id_login" style="text-align: center">
                     <a href="${kakao_url}">
                     <img width="223" 
                        src="images/kakao_account_login_btn_medium_narrow.png" /></a>
        </div>

카카오계정으로 로그인 쪽 VIEW소스는 이렇다.

로그인 버튼은 구글링해서 다운받자. 

자, 그럼 이 kakao_url은 어디서 받아오는 거냐?

 

 

@RequestMapping(value = "/memberloginform.do", method = RequestMethod.GET)
	public ModelAndView memberLoginForm(HttpSession session) {
		ModelAndView mav = new ModelAndView();
		/* 네아로 인증 URL을 생성하기 위하여 getAuthorizationUrl을 호출 */
		String naverAuthUrl = naverLoginDTO.getAuthorizationUrl(session);
		String kakaoUrl = KakaoController.getAuthorizationUrl(session);

		/* 생성한 인증 URL을 View로 전달 */
		mav.setViewName("memberloginform");
		// 네이버 로그인
		mav.addObject("naver_url", naverAuthUrl);
		// 카카오 로그인
		mav.addObject("kakao_url", kakaoUrl);

		return mav;
	}// end memberLoginForm()

MainController.java 파일인데, 

 

String kakaoUrl = KakaoController.getAuthorizationUrl(session);

mav.addObject("kakao_url", kakaoUrl);

 

이 부분에서 kakao_url을 받아온다.

ModelAndView로 설정했으므로, 마지막에 return mav하면 kakao_url이 반환되서

view단에서 받을 수 있는 것이다.

 

 

@RequestMapping(value = "/kakaologin.do", produces = "application/json", method = { RequestMethod.GET,
			RequestMethod.POST })
	public ModelAndView kakaoLogin(@RequestParam("code") String code, HttpServletRequest request,
			HttpServletResponse response, HttpSession session) throws Exception {
		ModelAndView mav = new ModelAndView();
		// 결과값을 node에 담아줌
		JsonNode node = KakaoController.getAccessToken(code);
		// accessToken에 사용자의 로그인한 모든 정보가 들어있음
		JsonNode accessToken = node.get("access_token");
		// 사용자의 정보
		JsonNode userInfo = KakaoController.getKakaoUserInfo(accessToken);
		String kemail = null;
		String kname = null;
		String kgender = null;
		String kbirthday = null;
		String kage = null;
		String kimage = null;
		// 유저정보 카카오에서 가져오기 Get properties
		JsonNode properties = userInfo.path("properties");
		JsonNode kakao_account = userInfo.path("kakao_account");
		kemail = kakao_account.path("email").asText();
		kname = properties.path("nickname").asText();
		kimage = properties.path("profile_image").asText();
		kgender = kakao_account.path("gender").asText();
		kbirthday = kakao_account.path("birthday").asText();
		kage = kakao_account.path("age_range").asText();
		session.setAttribute("kemail", kemail);
		session.setAttribute("kname", kname);
		session.setAttribute("kimage", kimage);
		session.setAttribute("kgender", kgender);
		session.setAttribute("kbirthday", kbirthday);
		session.setAttribute("kage", kage);
		mav.setViewName("main");
		return mav;
	}// end kakaoLogin()

value="/kakaologin.do"는 위에서 설정했던

여기와 같아야 한다.

 

 

 

 

 

 

 

반응형

'Back-End > Java(자바)' 카테고리의 다른 글

Cobra란?  (0) 2019.07.19
Java RMI(Remote Method Invocation) 개념  (0) 2019.07.19
JSTL 반복문(forEach) 사용법 정리  (2) 2019.06.28
CheckStyle, PMD, FindBugs, Ant 정리  (0) 2019.06.17
자바 공부중 정리(1)  (0) 2019.06.17
Comments