본문 바로가기

STUDY/SPRING

카카오 로그인 API 사용하기 - 4(로그인 완료)

반응형

이전 포스팅 : https://3unbbb.tistory.com/106

 

카카오 로그인 API 사용하기 3

이전 포스팅 : 카카오랑 연결 https://3unbbb.tistory.com/105 카카오 로그인 API 사용하기 -2 이전 포스트에서 카카오 로그인 API를 사용하기 위한 기본 설정 & 전체적인 흐름을 봤다. https://3unbbb.tistory.co..

3unbbb.tistory.com

 

이제 가져온 토큰으로 사용자 정보를 가져와야 함

이렇게 요청하면 >> 이런 정보를 받아올 수 있음

전체정보를 가져올 거니까 GET방식으로 부르기 & 요청 헤더 확인하기(access_token)

앞에 access_token은 받을 때 사용했던 방법이랑 비슷

  (outputStream이아닌 inputStream 사용)

	public void getUserInfo(String access_token) throws IOException {
		
		String Access_token = access_token;
		String url ="https://kapi.kakao.com/v2/user/me";
		
		URL con_url;
		try {
			con_url = new URL(url);
			
			//해당 주소 페이지로 접속 & 단일 http로 접속하기 위해 캐스팅
			HttpURLConnection conn = (HttpURLConnection) con_url.openConnection();
			
			//GET요청
			conn.setRequestMethod("GET");
			//POST or PUT 방식으로 요청을 보내려면 output을 true로 설정해야 함
			//conn.setDoOutput(true);
			
			//요청 헤더를 정의
			conn.setRequestProperty("Authorization", "Bearer "+Access_token);
			
			//InputStream 으로 응답 헤더와 메시지를 읽어들이는 옵션 정의
			//OutputStream 으로 post 데이터를 넘겨주는 옵션 정의
			
			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);
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

여기까지 작성하고 실행하면 아래와 같이 로그인한 계정의 정보가 출력됨

이 정보를 json으로 파싱해서 hashMap에 담아서 컨트롤러로 넘겨주면 된다.

hashMap에 담을 때는 각각 담아야 하므로 JsonObject를 사용

내가 필요한건 property의 nickname과 kakao_account의 email, birthday 임

property와 kakao_account를 파싱

 

데이터가 잘 불러와지면 hashmap에 넣어준 후 컨트롤러로 전달

(전체 코드)

	public HashMap<String, Object> getUserInfo(String access_token) throws IOException {
		
		String Access_token = access_token;
		String url ="https://kapi.kakao.com/v2/user/me";
		
		HashMap<String, Object> userInfo = new HashMap<String, Object>();
		
		URL con_url;
		try {
			con_url = new URL(url);
			
			//해당 주소 페이지로 접속 & 단일 http로 접속하기 위해 캐스팅
			HttpURLConnection conn = (HttpURLConnection) con_url.openConnection();
			
			//GET요청
			conn.setRequestMethod("GET");
			//POST or PUT 방식으로 요청을 보내려면 output을 true로 설정해야 함
			//conn.setDoOutput(true);
			
			//요청 헤더를 정의
			conn.setRequestProperty("Authorization", "Bearer "+Access_token);
			
			//InputStream 으로 응답 헤더와 메시지를 읽어들이는 옵션 정의
			//OutputStream 으로 post 데이터를 넘겨주는 옵션 정의
			
			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);
	        
	      //Json형식의 데이터를 파싱(gson 라이브러리 추가 다운로드하기)
			JsonParser parser = new JsonParser();
			JsonElement element = parser.parse(result);
			
			//properties와 kakao_account 안의 정보를 가져오기위해서 JsonObject로 Json 객체로 바꿔주기
			
			JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
			JsonObject kakao_account = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
			
			String nickname = properties.getAsJsonObject().get("nickname").getAsString();
			String birthday = kakao_account.getAsJsonObject().get("birthday").getAsString();
			String email = kakao_account.getAsJsonObject().get("email").getAsString();
			
			System.out.println("nickname : "+nickname);
			System.out.println("birthday : "+birthday);
			System.out.println("email : "+email);
			
			userInfo.put("nickname", nickname);
			userInfo.put("birthday", birthday);
			userInfo.put("email", email);
			
			br.close();
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return userInfo;
		
	}

 

컨트롤러 에서 뷰로 데이터 전달하기

(전체코드)

	@RequestMapping(value="/oauth", method=RequestMethod.GET)
	public String kakaologin(@RequestParam(value="code", required=false) String code, Model model ) throws IOException {
		
		log.info("code : "+code);
		
		String access_token = service.getAccessToken(code);
		log.info(access_token);
		
		
		model.addAttribute("userInfo",service.getUserInfo(access_token));
		
		return "/main";
	
	}

main.jsp

<html>
<head>
	<title>Main</title>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
<body>

<div>

<h2> accessToken</h2>

<input type="text" value="${userInfo.nickname }">
<input type="text" value="${userInfo.birthday }">
<input type="text" value="${userInfo.email }">

</div>

</body>
 <script src="https://developers.kakao.com/sdk/js/kakao.js"></script>
 
<script type="text/javascript">
	
</script>

</html>

 

>>>> 결과 

nickname은 한글이라서 인코딩 문제인 듯..

다른 결과값은 잘 들고 와진다.

이제 이 정보로 회원가입 or 로그인 처리하면 될 듯.

 

 

 

이전 포스트와 마찬가지로 https://antdev.tistory.com/37?category=807235 포스트를 참고하였습니다.

 

[Kakao Login API] 카카오 계정의 유저 정보 받아오기 및 마무리 (Spring Boot 환경에서 카카오 로그인 API

2019/03/22 - [OAuth/Kakao Login API] - [Kakao Login API] 카카오 로그인 API 서비스 구현 (Spring Boot 환경에서 카카오 로그인 API RESTful방식으로 연동하기 -3장) 2019/03/22 - [OAuth/Kakao Login API] - [..

antdev.tistory.com

HttpURIConnection 은 https://ibabo.tistory.com/266 블로그를  참고했습니다.

 

HttpURLConnection클래스로 웹페이지 POST 요청하기

http://blog.naver.com/musalhk/150082514641 [출처] HttpURLConnectio클래스로 웹페이지 POST 요청하기|작성자 무살해커 // 요청할 파라미터의 정보를 입력한다. String body = "id=asdf&pass=asdf"; // URL클래..

ibabo.tistory.com

반응형

'STUDY > SPRING' 카테고리의 다른 글

Spring Boot 기본 구조  (0) 2023.07.06
의존성 주입(DI)  (0) 2022.10.28
카카오 로그인 API 사용하기 - 3  (0) 2022.08.18
카카오 로그인 API 사용하기 -2  (1) 2022.08.16
카카오 로그인 api 사용하기 -1  (0) 2022.08.13