108일차_SpringBoot

서창민·2023년 8월 16일
0

SpringBoot

목록 보기
12/13
post-thumbnail

23.08.16 108일차

SpringBoot

  • 카카오톡 로그인
OAuthService.java

package com.majustory.k1.project;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
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 OAuthService {

	public String getKakaoAccessToken (String code) {
	    String accessToken = "";
	    String refreshToken = "";
	    String requestURL = "https://kauth.kakao.com/oauth/token";

	    try {
	        URL url = new URL(requestURL);
	        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

	        conn.setRequestMethod("POST");
	        // setDoOutput()은 OutputStream으로 POST 데이터를 넘겨 주겠다는 옵션이다.
	        // POST 요청을 수행하려면 setDoOutput()을 true로 설정한다.
	        conn.setDoOutput(true);

	        // POST 요청에서 필요한 파라미터를 OutputStream을 통해 전송
	        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
	        String sb = "grant_type=authorization_code" +
	                "&client_id=레스트api키값 넣는 위치" + // REST_API_KEY
	                "&redirect_uri=리다이텍트URI넣는 위치" + // REDIRECT_URI
	                "&code=" + code;
	        bufferedWriter.write(sb);
	        bufferedWriter.flush();

	        int responseCode = conn.getResponseCode();
	        System.out.println("responseCode : " + responseCode);

	        // 요청을 통해 얻은 데이터를 InputStreamReader을 통해 읽어 오기
	        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	        String line = "";
	        StringBuilder result = new StringBuilder();

	        while ((line = bufferedReader.readLine()) != null) {
	            result.append(line);
	        }
	        System.out.println("response body : " + result);

	        JsonElement element = JsonParser.parseString(result.toString());

	        accessToken = element.getAsJsonObject().get("access_token").getAsString();
	        refreshToken = element.getAsJsonObject().get("refresh_token").getAsString();

	        System.out.println("액세스토큰 : " + accessToken);
	        System.out.println("리프레쉬토큰 : " + refreshToken);

	        bufferedReader.close();
	        bufferedWriter.close();
	    } catch (IOException e) {
	        e.printStackTrace();
	    }

	    return accessToken;
	}
	
	
	
	
	public HashMap<String, Object> getUserInfo(String accessToken) {
	    HashMap<String, Object> userInfo = new HashMap<>();
	    String postURL = "https://kapi.kakao.com/v2/user/me";

	    try {
	        URL url = new URL(postURL);
	        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	        conn.setRequestMethod("POST");

	        conn.setRequestProperty("Authorization", "Bearer " + accessToken);

	        int responseCode = conn.getResponseCode();
	        System.out.println("responseCode : " + responseCode);

	        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	        String line = "";
	        StringBuilder result = new StringBuilder();

	        while ((line = br.readLine()) != null) {
	            result.append(line);
	        }
	        System.out.println("response body : " + result);

	        JsonElement element = JsonParser.parseString(result.toString());
	        JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
	        JsonObject kakaoAccount = element.getAsJsonObject().get("kakao_account").getAsJsonObject();

	        String nickname = properties.getAsJsonObject().get("nickname").getAsString();
	        String email = kakaoAccount.getAsJsonObject().get("email").getAsString();
	        String gender = kakaoAccount.getAsJsonObject().get("gender").getAsString();

	        userInfo.put("nickname", nickname);
	        userInfo.put("email", email);
	        userInfo.put("gender", gender);

	    } catch (IOException exception) {
	        exception.printStackTrace();
	    }

	    return userInfo;
	}
	
}

카카오디벨로퍼를 활용하여 로그인 코드를 붙여 구현을 해보았다.
setDoOutput()은 OutputStream으로 POST 데이터를 넘겨 주겠다는 옵션이고,POST 요청을 수행하려면 setDoOutput()을 true로 설정한다.
그리고 별칭과, 이메일 성별을 불러와 확인해 보았다.

pom.xml
<dependency> 
	<groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId>
</dependency>

먼저 pom.xml에 해당 내용을 추가하여 준다.
Maven을 통해 gson에 의존성을 부여한다.

Controller

	@GetMapping("/kakao/kakaoLogin.do")
	void kakaoLogin() { 
			
	}
	
    @ResponseBody
    @GetMapping("/kakao/kakaoLoginOK.do")
    public void kakaoLoginOK(@RequestParam String code, Model model) {
    	System.out.println("코드 ==> " + code);
    	//코드 ----------
    	
        OAuthService service = new OAuthService();
        String accessToken = service.getKakaoAccessToken(code);
        HashMap<String, Object> userInfo = service.getUserInfo(accessToken);
       
        //----------------------
        
        System.out.println("유저인포 ==> " + userInfo);
        //model.addAttribute("map", userInfo);
    }

컨트롤러에 해당 내용을 추가하여 정상적으로 값이 들어오는지 콘솔에서 출력으로 확인했다.
주의할점은 Gson의존성 주입후 필드가 제대로 존재하는지, JSON 데이터의 구조와 일치하는지 확인해야한다.

profile
Back-end Developer Preparation Students

0개의 댓글