본문 바로가기
  • 평범한 나의 개발공부 일지
나의 개발 기록/Java /Spring

[vue.js / spring boot] 카카오 로그인 api 해보기 (2)

by 블랑 블랑 2022. 8. 18.
반응형
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만 가져옴 *선택가능*)

 

반응형

댓글