반응형
1. 프론트(vue) 에서 백엔드(spring boot) 한테 카카오로그인 할수있는 URI 가 뭔지 물어본다
2. 로그인 진행
3. 카카오 서버에서 백엔드한테 code를 알려준다 (kakao callback)
4. 백엔드는 code를 바탕으로 token을 요청한다
5. 백엔드는 발급받은 token을 바탕으로 정보를 요청한다
6. 백엔드는 프론트 한테 로그인 정보를 알려준다
HomeController.java
KakaoAPI kakaoApi = new KakaoAPI();
@RequestMapping(value="/kakao_login/kakao")
public RedirectView kakaoCallback(@RequestParam String code, HttpSession session) {
System.out.println("kakao callback 컨트롤러 접근");
System.out.println(code);
RedirectView redirectView = new RedirectView();
//1. 코드전달
String access_token = kakaoApi.getAccessToken(code);
System.out.println("1. access_token : " + access_token);
//2. 인증코드로 토큰 전달
HashMap<String, Object> userInfo = kakaoApi.getUserInfo(access_token);
System.out.println("2. login info : " + userInfo);
System.out.println("2-1. login info : " + userInfo.toString());
if(userInfo.get("email") != null) {
session.setAttribute("userId", userInfo.get("email"));
session.setAttribute("access_token", access_token);
}
redirectView.addStaticAttribute("email", userInfo.get("email"));
redirectView.setUrl("http://localhost:8081");
return redirectView;
}
KakaoApi.java
package com.vue.vueProject.controller;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class KakaoAPI {
public String getAccessToken(String code) {
String accessToken = "";
String refreshToken = "";
String reqURL = "https://kauth.kakao.com/oauth/token";
try {
URL url = new URL(reqURL);
// 해당 주소의 페이지로 접속
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
//InputStream으로 응답 헤더와 메시지를 읽어들이겠다는 옵션을 정의한다.
conn.setDoOutput(true);
//writer: 출력, reader: 입력
//POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
StringBuilder sb= new StringBuilder();
sb.append("grant_type=authorization_code");
sb.append("&client_id=25abd73010194d66da5351385689ddc4");
sb.append("&redirect_url=http://localhost:8080/kakao_login/kakao");
sb.append("&code=" + code);
bw.write(sb.toString());
// 그리고 스트림의 버퍼를 비워준다.
bw.flush();
int responsCode = conn.getResponseCode();
System.out.println("3. responsCode = " + responsCode);
//요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
//파일의 한줄한줄을 읽어서 출력한다.
while((line = br.readLine())!=null) {
result += line;
}
System.out.println("resopnsebody = " + result);
//json 형식으로 파시변환
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
accessToken = element.getAsJsonObject().get("access_token").getAsString();
refreshToken = element.getAsJsonObject().get("refresh_token").getAsString();
// 스트림을 닫는다.
br.close();
bw.close();
}catch(Exception e) {
e.printStackTrace();
}
return accessToken;
}
public HashMap<String, Object> getUserInfo(String access_token) {
HashMap<String, Object> userInfo = new HashMap<String, Object>();
String reqUrl = "https://kapi.kakao.com/v2/user/me";
//access_token을 이용하여 사용자 정보 조회
try {
URL url = new URL(reqUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Authorization", "Bearer " + access_token);
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("resopnse body =" + result);
//Gson 라이브러리로 JSON파싱
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
String email = "";
boolean has_email = element.getAsJsonObject().get("kakao_account").getAsJsonObject().get("has_email").getAsBoolean();
if(has_email) {
email = element.getAsJsonObject().get("kakao_account").getAsJsonObject().get("email").getAsString();
}
userInfo.put("email", email);
} catch (Exception e) {
e.printStackTrace();
}
return userInfo;
}
}
위와 같은 코드로
최종적으로 카카오서버는 사용자정보를 알려주고 email정보를 담아 return해주면 된다 (나는 email만 가져옴 *선택가능*)
반응형
'나의 개발 기록 > Java /Spring' 카테고리의 다른 글
[전자정부프레임워크] egov commons-io 라이브러리 추가 (0) | 2022.09.07 |
---|---|
전자정부프레임워크에서 *.do 확장자 없이 접근하도록 수정해보기 (0) | 2022.08.18 |
[Spring boot] Session Timeout (만료 시간) 설정 하기 (0) | 2022.08.17 |
[Vue.js / spring boot] http header에 저장된 cookie 서버로 가져와보기 (0) | 2022.08.15 |
[JAVA / poi] 엑셀 다운로드시 셀 너비 넓히기 (0) | 2022.08.02 |
댓글