24.02.11

서린·2024년 2월 11일

혼자개발

목록 보기
43/82

엊그제까지도 파라미터code가 넘어오지 않는다는 에러에서 벗어나지 못했던 ...
다시 처음부터 차근차근 해보자는 마음으로
어제는 별다른 수확 없이 서칭만 계속 했었다

먼저 인증코드 요청하고 전달받기

1. controller 구현

요청하는 코드
여태까지 나는 redirect uri를 /home/home-list-view로 지정했었는데
원래 callback 받으려고 만들었던 /kakao/callback로 수정했다

@Controller
public class KakaoController {
	private Kakao_restapi kakao_restapi=new Kakao_restapi();
	
	    @GetMapping(value="/kakao/oauth")
	    public String kakaoConnect() {

	        StringBuffer url = new StringBuffer();
	        url.append("https://kauth.kakao.com/oauth/authorize?");
	        url.append("client_id=" + "1f0000000000000331eb10");
	        url.append("&redirect_uri=http://localhost:8080/kakao/callback");
	        url.append("&response_type=code");

	        return "redirect:" + url.toString();
	    }
}

이 코드를 통해 내가 작성한 코드의 파라미터들이 카카오에게 전송되어 콜백된다
이 콜백한 것을 받기위해 위의 KakaoController에 코드를 추가해준다

//callback한 것 받는 코드
	    @RequestMapping(value="/kakao/callback",produces="application/json",method= {RequestMethod.GET, RequestMethod.POST})
	    public void kakaoLogin(
	    		@RequestParam("code")String code, 
	    		RedirectAttributes ra, 
	    		HttpSession session, 
	    		HttpServletResponse response, 
	    		Model model)throws IOException {

	        System.out.println("kakao code:"+code);
	}

kakaoConnect() :
사용자를 카카오로 redirect할 때 필요한 url을 구성하는 메소드
url 구성 후 사용자의 브라우저를 그 url로 redirect

kakaoLogin() :
사용자 인증 후 카카오에서 호출하는 메소드
인증코드를 파라미터로 받는다
카카오의 토큰 엔드포인트에 요청해 엑세스 토큰으로 교환

그리고 Kakao_restapi.java에서 인증코드를 액세스 토큰으로 교환하는 메소드 구현

public class Kakao_restapi {

	//토큰 가져오기
	public static JsonNode getKakaoAccessToken(String code) { 
		  //System.out.println("restapi클래스"+code);
		        final String RequestUrl = "https://kauth.kakao.com/oauth/token"; // Host
		        final List<NameValuePair> postParams = new ArrayList<>();
		 
		        postParams.add(new BasicNameValuePair("grant_type", "authorization_code"));
		        postParams.add(new BasicNameValuePair("client_id", "1f9ba236274cc877d8d549827331eb10")); // REST API KEY
		        postParams.add(new BasicNameValuePair("redirect_uri", "http://localhost:8080/kakao/callback")); // 리다이렉트 URI
		        postParams.add(new BasicNameValuePair("code", code)); // 로그인 과정중 얻은 code 값
		 
		        final HttpClient client = HttpClient.newHttpClient();
		        final HttpRequest.Builder requestBuilder = HttpRequest.newBuilder()
		                .uri(java.net.URI.create(RequestUrl))
		                .header("Content-Type", "application/x-www-form-urlencoded")
		                .POST(HttpRequest.BodyPublishers.ofString(URLEncodedUtils.format(postParams, "UTF-8")));

		 
		        JsonNode returnNode = null;
		 
		        try {
		        	 final HttpResponse<String> response = client.send(requestBuilder.build(), HttpResponse.BodyHandlers.ofString());
		             final int responseCode = response.statusCode();
		 
		            System.out.println("\nSending 'POST' request to URL : " + RequestUrl);
		            System.out.println("Post parameters : " + postParams);
		            System.out.println("Response Code : " + responseCode);
		 
		            // JSON 형태 반환값 처리
		            ObjectMapper mapper = new ObjectMapper();
		 
		            returnNode = mapper.readTree(response.body());
		 
		        } catch (IOException | InterruptedException e) {
		            e.printStackTrace();
		        }

		        return returnNode;
		    }
	
}

HttpClient 인스턴스를 생성하고 카카오의 토큰 엔드포인트에 대한 HttpPost 요청 설정
POST 요청 실행, 응답처리
카카오 서버로부터 받은 JSON응답을 Jackson라이브러리의 ObjectMapper이용해 파싱
액세스 토큰을 JsonNode로 반환

코드 작성뒤
NameValuePair
BasicNameValuePair
URLEncodedUtils
를 import 할 때 에러 발생
종속성 때문이라 생각되어 서칭 후 추가
implementation 'org.apache.httpcomponents:httpclient:4.5.13'

여기까지 완료 한 뒤
카카오 로그인 시도 하고, 동의하기를 누르니 console에 code가 찍히는것을 확인 했다

방금까지 한 인증코드 가져오는 과정을 그려봤다


원래 코드
@RestController
public class KakaoController {

//카카오 로그인 요청을 처리하는 controller
private static final String KAKAO_TOKEN_API_URL = "https://kauth.kakao.com/oauth/token";
private static final String CLIENT_ID = "1f9ba236274cc877d8d549827331eb10";
private static final String REDIRECT_URI = "http://localhost:8080/home/home-list-view";
private static final String CLIENT_SECRET = "BkxnvTQ2F2NcS8zzxETpPnh5oC3JO95u";

@GetMapping("/login/kakao/callback")
public String kakaoLoginCallback(@RequestParam("code") String code) {
    // 카카오로부터 받은 인가 코드로 토큰을 요청
    String tokenRequestUrl = KAKAO_TOKEN_API_URL
            + "?grant_type=authorization_code"
            + "&client_id=" + CLIENT_ID
            + "&redirect_uri=" + REDIRECT_URI
            + "&code=" + code
            + "&client_secret=" + CLIENT_SECRET;

    RestTemplate restTemplate = new RestTemplate();
    String response = restTemplate.postForObject(tokenRequestUrl, null, String.class);

    // 토큰을 받아서 사용자 정보 요청 등 추가 작업 수행
    // 여기서는 간단하게 받은 응답을 출력
    System.out.println(response);

    return "redirect:/home/home-list-view";
}

}

0개의 댓글