카카오 사용자 정보 가져오기

송영재·2022년 10월 23일

Spring

목록 보기
16/45
  • 30) 카카오 서버에서 인가코드 받기

    🌐 참고: "인가코드 받기" 메뉴얼

    • 카카오 인가코드 받기
      • 인가코드 요청 방법
        https://kauth.kakao.com/oauth/authorize?**client_id**=**{REST_API_KEY}**&**redirect_uri**=**{REDIRECT_URI}**&response_type=code
      • "/templates/login.html" 파일 수정
        • 아래 코드 부분을 찾아, "client_id=" 뒷부분에 REST API 키 추가
          https://kauth.kakao.com/oauth/authorize?**client_id**=***본인의 REST API키***&**redirect_uri**=http://localhost:8080/user/kakao/callback&response_type=code
    • 카카오 디벨로퍼스 사이트에서 REST API 키 확인
      • [코드스니펫] 카카오 디벨로퍼스 사이트
        https://developers.kakao.com/console/app
    • 카카오 로그인 시도
      • "카카오계정(이메일)" 을 꼭 동의!

        👉 사용자가 카카오 로그인 페이지를 통해 '동의하고 계속하기'를 클릭하면, Redirect URI (callback) 로 '인가코드'가 전달 됩니다.

    • 카카오에서 보내주는 '인가코드' 처리
      • [코드스니펫] controller > UserController
        		@GetMapping("/user/kakao/callback")
            public String kakaoLogin(@RequestParam String code) {
                // authorizedCode: 카카오 서버로부터 받은 인가 코드
                userService.kakaoLogin(code);
        
                return "redirect:/";
            }
      1. 카카오에서 보내주는 '인가코드'를 받음 ⇒ Controller

        Sample)

        💡 http://localhost:8080/user/kakao/callback?code=zAGhy36K0...

      2. '인가코드'를 가지고 카카오 로그인 처리 ⇒ Service

      3. 로그인 성공 시 "/" 으로 redirect ⇒ Controller

  • 31) 카카오 사용자 정보 가져오기

    1. "인가 코드"로 "액세스 토큰" 요청
      • [코드스니펫] 액세스 토큰 요청
        				// 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();
      • KakaoOAuth2 에 발급 받은 본인의 REST API 키 입력
        body.add("client_id", "*본인의 REST API키*");
    2. "액세스 토큰"으로 "카카오 사용자 정보" 가져오기
      • [코드스니펫] 사용자 정보 요청
        				// 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);
      • 카카오 사용자 정보 JSON 의 예
        {
          "**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"
          }
        }

0개의 댓글