1. HomeController 나머지 부분
<HomeController.java>
access_token을 이용하여 사용자의 정보를 받아오는 과정은 GetUserInfoService에서 처리했다.
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();
//유저 정보가 포함된 JSON String을 받아온다.
GetUserInfoService getUserInfoService = new GetUserInfoService();
String userInfo = getUserInfoService.getUserInfo(accessToken);
//JSON String -> JSON Object
JSONObject userInfoJsonObject = new JSONObject(userInfo);
//유저의 Email 추출
JSONObject kakaoAccountJsonObject = (JSONObject)userInfoJsonObject.get("kakao_account");
String email = kakaoAccountJsonObject.get("email").toString();
//View에서 사용할 변수 설정
model.addAttribute("email", email);
return "success";
}
}
2. 문서 확인 - 사용자 정보 가져오기
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#req-user-info
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
1) 요청 양식
문서에서 사용자의 정보를 가져오는 방법을 확인했다. Bearer Authorization 헤더 또는 요청 파라미터에 access_token을 넣으면 된다. GET 요청의 경우에는 안전하게 헤더에 넣는 것이 좋다.
2) 응답 양식
문서를 확인해도 좋지만, 응답 양식을 더 직관적으로 확인하기 위해 [REST API 테스트] 기능을 이용할 수도 있다.
https://developers.kakao.com/tool/rest-api/open/get/v2-user-me
카카오계정 로그인
여기를 눌러 링크를 확인하세요.
accounts.kakao.com
[토큰 발급]을 눌러서 임시 엑세스 토큰을 발급하고, [전송]을 누르면 응답 양식을 JSON 구조로 미리 확인 가능하다.
이 샘플 응답 메세지를 참고하여 원하는 데이터의 구조적 위치를 파악해두면 된다.
▣ email의 위치 : kakao_account -> email
3. GetUserInfoService
<GetUserInfoService.java>
문서에 있는 양식대로 요청 URI을 적용했다.
package com.example.demo.service;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
public class GetUserInfoService {
private final String HTTP_REQUEST = "https://kapi.kakao.com/v2/user/me";
public String getUserInfo(String accessToken){
try {
String jsonData = "";
// URI를 URL객체로 저장
URL url = new URL(HTTP_REQUEST + "?access_token=" + accessToken);
// 버퍼 데이터(응답 메세지)를 한 줄씩 읽어서 jsonData에 저장
BufferedReader bf;
bf = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
String line;
while((line = bf.readLine()) != null){
jsonData+=line;
}
return jsonData;
} catch(Exception e) {
return "success";
}
}
}
4. 로그아웃
1) Logout Redirect URI 등록
로그아웃한 사용자를 이동시킬 URI를 지정해야 하며, [카카오 로그인] -> [고급]에서 등록할 수 있다.
2) 문서 확인 - 로그아웃
로그아웃을 위한 요청 URI는 최소 2개의 파라미터로 어렵지 않게 작성할 수 있으며, access_token은 필요 없다.
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#logout-of-service-and-kakaoaccount
요청 URI 예시
https://kauth.kakao.com/oauth/logout
?client_id=50ca5e8cf40713abcab868ed9ed3047d
&logout_redirect_uri=http%3A%2F%2Fkimcoder.kro.kr%3A8080%2Fhome
5. View
<success.mustache>
로그인을 마친 사용자의 이메일과 로그아웃 링크를 출력했다.
<html>
<head>
<meta charset="UTF-8">
<title>Kakao Login</title>
</head>
<body>
<h2>이메일</h2>
<p>{{email}}</p><br>
<h2>로그아웃</h2>
<a href="https://kauth.kakao.com/oauth/logout?client_id=50ca5e8cf40713abcab868ed9ed3047d&logout_redirect_uri=http%3A%2F%2Fkimcoder.kro.kr%3A8080%2Fhome">로그아웃</a>
</body>
</html>
6. 실행
1) 로그인을 마친 후
2) 로그아웃
3) 로그아웃 직후 home으로 복귀
'OpenAPI > OAuth' 카테고리의 다른 글
[OAuth] Naver Login (0) | 2021.08.09 |
---|---|
[OAuth] Kakao Login(2) - Access Token 받기 (0) | 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 |
댓글