개발/Spring & SpringBoot

카카오 로그인 만들기 2

dev-yoon-jerry 2021. 5. 21. 18:26

코드까진 받았으니 토큰을 요청해보자.

 

문서에 설명이 너무 잘되어있다. 그래도 해보는걸로.

 

@Service
public class KakaoLoginService {
	public String getAccessToken (String auth_code) {
		String access_token = "";
		String refresh_token = "";
		String reqURL = "https://kauth.kakao.com/oauth/token";
		try {
			URL url = new URL(reqURL);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			            
			//    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=키가들어있지요");
			sb.append("&redirect_uri=http://localhost:8080/happyhouse8/kakaologindone");
			sb.append("&code=" + auth_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);
			            
			access_token = element.getAsJsonObject().get("access_token").getAsString();
			refresh_token = element.getAsJsonObject().get("refresh_token").getAsString();
			            
			System.out.println("access_token : " + access_token);
			System.out.println("refresh_token : " + refresh_token);
			            
			br.close();
			bw.close();
			} catch (IOException e) {
				e.printStackTrace();
		} 
		return access_token;
	}
}

토큰을 넘겨받아 access token을 가져오는 서비스. 예전에 했던 프로젝트에서 가져온 코드인데 분명 내가 작성한 코드는 아닌 것 같다. (친구가 만든걸수도 있고 어디서 가져온 코드일수도 있고..) gson이라는 라이브러리로 json을 파싱하는데 예전에 Node.js로 백엔드 만들때 한번들어봤었지.

gradle dependencies에 추가해주고. gradle을 refresh해준다.

@Controller
public class KakaoLoginController {
	
	@Autowired
	private KakaoLoginService kakaoLogin;
	
	@RequestMapping(value="/kakaologin")
	public String kakao() {
		return "kakaologin";
	}
	
	@RequestMapping(value="/kakaologindone")
	public String login(@RequestParam("code") String code) {
		System.out.println("code: " + code);
		String access_token = kakaoLogin.getAccessToken(code);
		System.out.println("access_token" + access_token);
		return "redirect:/";
	}
}

서비스를 컨트롤러에서 사용하도록 변경하고.

토큰들 잘 받아온 것을 확인. 이제 사용자 정보를 가져와야겠다

	public HashMap<String, Object> getUserInfo (String access_token) {
		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("POST");
	        conn.setRequestProperty("Authorization", "Bearer " + access_token);   
	        int responseCode = conn.getResponseCode();       
	        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); 
	        String line = "";
	        String result = "";    
	        while ((line = br.readLine()) != null) {
	        	result += line;
	        }
	        JsonParser parser = new JsonParser();
	        JsonElement element = parser.parse(result);
	        String id = element.getAsJsonObject().get("id").getAsString();
	        JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();    
	        String nickname = properties.getAsJsonObject().get("nickname").getAsString();
	        userInfo.put("id", id);
	        userInfo.put("name", nickname);
	        br.close();
	            
	    } catch (IOException e) {
	        e.printStackTrace();
	    }
	        
	    return userInfo;
	}

서비스에 유저정보를 받는 부분 추가. 이것도 거의 90%는 예전에 공부했던 코드에서 가져왔다. 기존에는 이메일도 필요하다 생각했는데, 회의를 통해 닉네임, id정도만 가져와도 충분하다고 생각해서 id, name만 가져왔다.

@Controller
public class KakaoLoginController {
	
	@Autowired
	private KakaoLoginService kakaoLogin;
	
	@RequestMapping(value="/kakaologin")
	public String kakao() {
		return "kakaologin";
	}
	
	@RequestMapping(value="/kakaologindone")
	public String login(@RequestParam("code") String code, HttpSession session) {
		System.out.println("code: " + code);
		String access_token = kakaoLogin.getAccessToken(code);
		System.out.println("access_token" + access_token);
		HashMap<String,Object> userInfo = kakaoLogin.getUserInfo(access_token);
		session.setAttribute("userId", userInfo.get("id"));
		session.setAttribute("name", userInfo.get("name"));
		System.out.println(userInfo);
		return "redirect:/";
	}
}

기존 서비스는 세션에 userId, name을 넣어서 사용하기 때문에 id와 닉네임을 세션에 넣어주었다.

세션에 잘들어간 것을 확인할 수 있다. 로그아웃 누르면 세션에서만 로그아웃되기 때문에 따로 카카오 로그아웃 처리를 해줘야한다.

일단 여기까지..

'개발 > Spring & SpringBoot' 카테고리의 다른 글

aws sdk로 s3업로드하기 & steam 업로드  (0) 2024.06.23
Spring 3 RestController 구현  (0) 2022.06.23
카카오 로그인 만들기 3  (0) 2021.05.23
카카오 로그인 만들기 1  (0) 2021.05.21