◎ 예제 프로젝트 정보
Editor : IntelliJ
Web Framework : SpringBoot - Maven
https://github.com/jooyeokkim/Kakao-Login-with-SpringBoot
이제 Kakao Login API 문서를 참고하여, 사용자의 Access Token을 받아볼 것이다.
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
1. 프로젝트 구성
2. 동의 항목(scope) 설정
Kakao API는 Google API와 다르게, scope코드를 별도로 작성하지 않아도 된다.
대신, 내 애플리케이션의 동의항목 페이지에서 설정해야 한다.
사용자의 정보는 사용자가 동의한 부분만 사용할 수 있으며,
아래에 링크한 문서에서 사용자의 정보별로 필요한 동의 항목을 확인할 수 있다.
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#kakao_account
3. Authorization Code 발급
1) 요청 파라미터 확인
문서에서 Authorization Code를 발급받기 위한 요청 URI 양식을 확인해야 한다.
client_id는 애플리케이션의 REST API 키 값이고, redirect_uri는 Authorizaion Code값을 받을 페이지 경로이다.
2) 요청 URI 작성
문서를 참조하여 요청 URI를 완성했다. redirect_uri는 반드시 encode된 값으로 적용하도록 하자.
https://kauth.kakao.com/oauth/authorize
?response_type=code
&client_id=50ca5e8cf40713abcab868ed9ed3047d
&redirect_uri=http%3A%2F%2Fkimcoder.kro.kr%3A8080%2FreceiveAC
<home.mustache>
요청 URI 링크가 있는 페이지다. 이 요청 URI를 클릭하면, Kakao 로그인 페이지로 이동하게 된다.
<html>
<head>
<meta charset="UTF-8">
<title>Kakao Login</title>
</head>
<body>
<a href="https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=50ca5e8cf40713abcab868ed9ed3047d&redirect_uri=http%3A%2F%2Fkimcoder.kro.kr%3A8080%2FreceiveAC">
요청 URI
</a>
</body>
</html>
3) Authorization Code 발급 받기
(1) home 접속
(2) 로그인 페이지
(3) 동의 화면
동의까지 완료했다면 Authorization Code가 redirect_uri에 포함되어 전송된다.
예시
http://kimcoder.kro.kr:8080/receiveAC?code=Jy1dgghZrxw76k7oYUPs4aLCbOc8sx1Yr2cSKpvo0d0wV-u03LueMVoOzUZilyECmcXTDQo9c5oAAAF7I-hBHw
4. Access Token 발급
1) HomeController
<HomeController.java>
code(Authorization Code)를 이용하여 access_token을 발급받는 과정은 RestJsonService 클래스에서 처리했다.
package com.example.demo.controller;
import com.example.demo.service.GetUserInfoService;
import com.example.demo.service.RestJsonService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.json.JSONObject;
@Controller
public class HomeController {
@GetMapping("/home")
public String home(Model model){
return "home";
}
@GetMapping("/receiveAC")
public String receiveAC(@RequestParam("code") String code, Model model) {
RestJsonService restJsonService = new RestJsonService();
//access_token이 포함된 JSON String을 받아온다.
String accessTokenJsonData = restJsonService.getAccessTokenJsonData(code);
if(accessTokenJsonData=="error") return "error";
//JSON String -> JSON Object
JSONObject accessTokenJsonObject = new JSONObject(accessTokenJsonData);
//access_token 추출
String accessToken = accessTokenJsonObject.get("access_token").toString();
model.addAttribute("access_token", accessToken);
//... 생략
}
}
2) RestJsonService
RestTemplate을 이용하여 Kakao API에 접근하기 위해서는, Content-type Header를 아래와 같은 타입으로 설정해서 붙여줘야 한다.
※ Google API는 헤더 설정 없이 전송해도 잘 동작됐음
<RestJsonService.java>
HttpHeaders 객체를 이용하여 Content-type 헤더를 다음과 같이 추가했다.
package com.example.demo.service;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
public class RestJsonService {
private final String GRANT_TYPE= "authorization_code";
private final String CLIENT_ID = "50ca5e8cf40713abcab868ed9ed3047d";
private final String REDIRECT_URI= "http://kimcoder.kro.kr:8080/receiveAC";
private final String CLIENT_SECRET= "6hTKH...생략";
private final String TOKEN_URL = "https://kauth.kakao.com/oauth/token";
public String getAccessTokenJsonData(String code){
RestTemplate restTemplate = new RestTemplate();
// 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity request = new HttpEntity(headers);
// URI 빌더 사용
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(TOKEN_URL)
.queryParam("grant_type", GRANT_TYPE)
.queryParam("client_id", CLIENT_ID)
.queryParam("redirect_uri", REDIRECT_URI)
.queryParam("code", code)
.queryParam("client_secret", CLIENT_SECRET);
// 요청 URI과 헤더를 같이 전송
ResponseEntity<String> responseEntity = restTemplate.exchange(
uriComponentsBuilder.toUriString(),
HttpMethod.POST,
request,
String.class
);
if (responseEntity.getStatusCode() == HttpStatus.OK) {
return responseEntity.getBody();
}
return "error";
}
}
위와 같이 RestTemplate의 exchange() 메소드를 이용하면, URI와 헤더를 원하는 전송 방식으로 전송할 수 있다.
GetUserInfoService까지 설명하는 것은 이번 주제에 벗어나기 때문에 다음 포스팅에서 설명하기로 한다.
다음 포스팅에서는 access_token을 이용하여 사용자의 이메일을 가져오는 부분과 로그아웃 기능을 다루면서 Kakao Login 예제 포스팅을 마무리할 것이다.
'OpenAPI > OAuth' 카테고리의 다른 글
[OAuth] Naver Login (0) | 2021.08.09 |
---|---|
[OAuth] Kakao Login(3) - 사용자 email 받기 / 로그 아웃 (1) | 2021.08.08 |
[OAuth] Kakao Login(1) - 내 애플리케이션 설정 (0) | 2021.08.07 |
[OAuth] Google Calendar(4) - 내 서비스에 적용하기 (3) | 2021.08.04 |
[OAuth] Google Calendar(3) - Access Token 받기 (0) | 2021.08.02 |
댓글