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

[OAuth] Kakao Login(2) - Access Token 받기

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

◎ 예제 프로젝트 정보

Editor : IntelliJ

Web Framework : SpringBoot - Maven

https://github.com/jooyeokkim/Kakao-Login-with-SpringBoot

 

GitHub - jooyeokkim/Kakao-Login-with-SpringBoot

Contribute to jooyeokkim/Kakao-Login-with-SpringBoot development by creating an account on GitHub.

github.com

 

 

이제 Kakao Login API 문서를 참고하여, 사용자의 Access Token을 받아볼 것이다.

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api 

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

1. 프로젝트 구성

 

 

2. 동의 항목(scope) 설정

Kakao API는 Google API와 다르게, scope코드를 별도로 작성하지 않아도 된다.

대신, 내 애플리케이션의 동의항목 페이지에서 설정해야 한다.

 

사용자의 정보는 사용자가 동의한 부분만 사용할 수 있으며,

아래에 링크한 문서에서 사용자의 정보별로 필요한 동의 항목을 확인할 수 있다.

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#kakao_account

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

 

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 예제 포스팅을 마무리할 것이다.

 

 

반응형

댓글