카카오 로그인 처리 단계를 아래의 세 단계로 나눠보았다. 인가 코드 받기 -> 토큰 받기 -> 사용자 정보 가져오기 이 중 인가 코드 받기 단계를 JavaScript SDK의 Kakao.Auth.authorize 함수로 요청하고 나머지 단계는 REST API로 처리해주었다.
카카오 로그인을 시작하기 전에 먼저 카카오 개발자 사이트에서 어플리케이션을 등록해주고 카카오 로그인을 설정해주어야한다. 카카오 개발자 사이트에서 어플리케이션을 등록 완료했다는 가정하에 작성하였다.
사용자가 카카오 로그인 버튼을 클릭했을 때, 클릭 이벤트 핸들러에서 Kakao.Auth.authorize 함수를 호출하면 카카오 로그인 동의 화면을 띄울 수 있다. 동의 화면에서 사용자가 사용자 정보 제공 및 기능 활용 동의를 하고 ‘동의하고 계속하기’ 버튼을 누르면 인가 코드가 발급된다.
//POST 요청을 위해 기본값이 false인 setDoOutput을 true로 conn.setRequestMethod("POST"); conn.setDoOutput(true);
//POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream())); StringBuilder sb = new StringBuilder(); sb.append("grant_type=authorization_code"); sb.append("&client_id=" + this.config.getString("system.kakao.restapikey")); //본인이 발급받은 key sb.append("&redirect_uri=" + this.config.getString("system.jsp.siteUrl") + "/login/snsKakaologin"); // 본인이 설정해 놓은 경로 sb.append("&code=" + code); bw.write(sb.toString()); bw.flush();
//결과 코드가 200이라면 성공 int responseCode = conn.getResponseCode(); System.out.println("responseCode : " + responseCode);
//요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = ""; String result = "";
while ((line = br.readLine()) != null) { result += line; } System.out.println("response body : " + result);
//Gson 라이브러리에 포함된 클래스로 JSON파싱 객체 생성 JsonParser parser = new JsonParser(); JsonElement element = parser.parse(result);
// 카카오 사용자 핸드폰 번호 추출 public HashMap<String, Object> getKakaoUniqueNo(String accessToken)throws Exception { //요청하는 클라이언트마다 가진 정보가 다를 수 있기에 HashMap타입으로 선언 HashMap<String, Object> userInfo = new HashMap<>(); String reqURL = "https://kapi.kakao.com/v2/user/me"; try { URL url = new URL(reqURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET");
//요청에 필요한 Header에 포함될 내용 conn.setRequestProperty("Authorization", "Bearer " + accessToken);
int responseCode = conn.getResponseCode(); System.out.println("responseCode : " + responseCode);
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = ""; String result = "";
while ((line = br.readLine()) != null) { result += line; } System.out.println("response body : " + result);
JsonParser parser = new JsonParser(); JsonElement element = parser.parse(result);