본문 바로가기
  • 실행력이 모든걸 결정한다
OpenAPI/OAuth

[OAuth] Kakao Login(3) - 사용자 email 받기 / 로그 아웃

by 김코더 김주역 2021. 8. 8.
반응형

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으로 복귀

반응형

댓글