보라코딩

스프링부트 카카오 API 로그인 본문

코딩/Spring

스프링부트 카카오 API 로그인

new 보라 2023. 6. 6. 19:57

 

 

 

kakaoLogin 폴더 내

 

 

kakaoLogin.html
<a href="https://kauth.kakao.com/oauth/authorize?client_id={REST API 키}&{redirect_uri=edirect_uri등록한것}&response_type=code">
    카카오 로그인하기
</a>

 

 

 

 

 

KakaoLoginController
package com.tastemate.controller;

import com.tastemate.service.KakaoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/kakaoLogin")
@Slf4j
public class KakaoLoginController {


    @GetMapping("/kakaoLogin")
    public void kakaoLogin() {
    }


    @Autowired
    private KakaoService kakaoService;


    @RequestMapping(value="/kakaoResult",produces="application/json",method= {RequestMethod.GET, RequestMethod.POST})
    public String kakaoResult(@RequestParam("code") String code){
        log.info("#########" + code);
        String access_Token = kakaoService.getAccessToken(code);
        log.info("###access_Token#### : " + access_Token);
        return "redirect:/store/main";
    }

}

 

 

 

 

KakaoService
package com.tastemate.service;

import com.google.gson.JsonElement;
import org.springframework.stereotype.Service;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.JsonParser;


@Service
public class KakaoService {


    public String getAccessToken (String authorize_code) {
        String access_Token = "";
        String refresh_Token = "";
        String reqURL = "https://kauth.kakao.com/oauth/token";

        try {
            URL url = new URL(reqURL);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //    POST 요청을 위해 기본값이 false인 setDoOutput을 true로

            conn.setRequestMethod("POST");
            conn.setDoOutput(true);

            //    POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
            StringBuilder sb = new StringBuilder();
            sb.append("grant_type=authorization_code");
            sb.append("&client_id=본인이 발급받은 key");  //본인이 발급받은 key
            sb.append("&redirect_uri=본인이 설정해 놓은 경로");     // 본인이 설정해 놓은 경로
            sb.append("&code=" + authorize_code);
            bw.write(sb.toString());
            bw.flush();

            //    결과 코드가 200이라면 성공
            int responseCode = conn.getResponseCode();
            System.out.println("responseCode : " + responseCode);

            //    요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = "";
            String result = "";

            while ((line = br.readLine()) != null) {
                result += line;
            }
            System.out.println("response body : " + result);

            //    Gson 라이브러리에 포함된 클래스로 JSON파싱 객체 생성
            JsonParser parser = new JsonParser();
            JsonElement element = parser.parse(result);

            access_Token = element.getAsJsonObject().get("access_token").getAsString();
            refresh_Token = element.getAsJsonObject().get("refresh_token").getAsString();

            System.out.println("access_token : " + access_Token);
            System.out.println("refresh_token : " + refresh_Token);

            br.close();
            bw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return access_Token;
    }
}