엊그제까지도 파라미터code가 넘어오지 않는다는 에러에서 벗어나지 못했던 ...
다시 처음부터 차근차근 해보자는 마음으로
어제는 별다른 수확 없이 서칭만 계속 했었다
먼저 인증코드 요청하고 전달받기
요청하는 코드
여태까지 나는 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";
}
}