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
1) 요청 양식
문서에서 사용자의 정보를 가져오는 방법을 확인했다. Bearer Authorization 헤더 또는 요청 파라미터에 access_token을 넣으면 된다. GET 요청의 경우에는 안전하게 헤더에 넣는 것이 좋다.
2) 응답 양식
문서를 확인해도 좋지만, 응답 양식을 더 직관적으로 확인하기 위해 [REST API 테스트] 기능을 이용할 수도 있다.
https://developers.kakao.com/tool/rest-api/open/get/v2-user-me
[토큰 발급]을 눌러서 임시 엑세스 토큰을 발급하고, [전송]을 누르면 응답 양식을 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 |
댓글