30) 카카오 서버에서 인가코드 받기

🌐 참고: "인가코드 받기" 메뉴얼
https://kauth.kakao.com/oauth/authorize?**client_id**=**{REST_API_KEY}**&**redirect_uri**=**{REDIRECT_URI}**&response_type=codehttps://kauth.kakao.com/oauth/authorize?**client_id**=***본인의 REST API키***&**redirect_uri**=http://localhost:8080/user/kakao/callback&response_type=codehttps://developers.kakao.com/console/app"카카오계정(이메일)" 을 꼭 동의!
👉 사용자가 카카오 로그인 페이지를 통해 '동의하고 계속하기'를 클릭하면, Redirect URI (callback) 로 '인가코드'가 전달 됩니다.
@GetMapping("/user/kakao/callback")
public String kakaoLogin(@RequestParam String code) {
// authorizedCode: 카카오 서버로부터 받은 인가 코드
userService.kakaoLogin(code);
return "redirect:/";
}카카오에서 보내주는 '인가코드'를 받음 ⇒ Controller
Sample)
💡 http://localhost:8080/user/kakao/callback?code=zAGhy36K0...
'인가코드'를 가지고 카카오 로그인 처리 ⇒ Service
로그인 성공 시 "/" 으로 redirect ⇒ Controller
31) 카카오 사용자 정보 가져오기

// 1. "인가 코드"로 "액세스 토큰" 요청
// HTTP Header 생성
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
// HTTP Body 생성
MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
body.add("grant_type", "authorization_code");
body.add("client_id", "*본인의 REST API키*");
body.add("redirect_uri", "http://localhost:8080/user/kakao/callback");
body.add("code", code);
// HTTP 요청 보내기
HttpEntity<MultiValueMap<String, String>> kakaoTokenRequest =
new HttpEntity<>(body, headers);
RestTemplate rt = new RestTemplate();
ResponseEntity<String> response = rt.exchange(
"https://kauth.kakao.com/oauth/token",
HttpMethod.POST,
kakaoTokenRequest,
String.class
);
// HTTP 응답 (JSON) -> 액세스 토큰 파싱
String responseBody = response.getBody();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(responseBody);
String accessToken = jsonNode.get("access_token").asText();body.add("client_id", "*본인의 REST API키*"); // 2. 토큰으로 카카오 API 호출
// HTTP Header 생성
headers.add("Authorization", "Bearer " + accessToken);
headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
// HTTP 요청 보내기
HttpEntity<MultiValueMap<String, String>> kakaoUserInfoRequest = new HttpEntity<>(headers);
response = rt.exchange(
"https://kapi.kakao.com/v2/user/me",
HttpMethod.POST,
kakaoUserInfoRequest,
String.class
);
responseBody = response.getBody();
jsonNode = objectMapper.readTree(responseBody);
Long id = jsonNode.get("id").asLong();
String nickname = jsonNode.get("properties")
.get("nickname").asText();
String email = jsonNode.get("kakao_account")
.get("email").asText();
System.out.println("카카오 사용자 정보: " + id + ", " + nickname + ", " + email);{
"**id**": 1632335751,
"properties": {
"**nickname**": "르탄이",
"profile_image": "http://k.kakaocdn.net/...jpg",
"thumbnail_image": "http://k.kakaocdn.net/...jpg"
},
"kakao_account": {
"profile_needs_agreement": false,
"profile": {
"nickname": "르탄이",
"thumbnail_image_url": "http://k.kakaocdn.net/...jpg",
"profile_image_url": "http://k.kakaocdn.net/...jpg"
},
"has_email": true,
"email_needs_agreement": false,
"is_email_valid": true,
"is_email_verified": true,
"**email**": "letan@sparta.com"
}
}