카카오 로그인 구현 REST API
3) 사용자 정보 요청
토큰을 얻었다면 이젠 사용자의 정보를 요청하여 가져올 수 있습니다.
v1 API에서 v2 API로 업데이트가 되었기때문에 v2기준으로 작성하겠습니다.
관리자가 특정 사용자의 정보를 얻어내고자 할 때는 어드민 키와 사용자 ID를 통해서도 요청할 수 있습니다.
해당 기능을 사용하기 위해서는 앱 사용자 전체를 관리 할 수 있는 어드민 키(Admin Key)가 필요합니다. 어드민 키가 탈취되는 일이 없도록 앱 내에서 직접 어드민 키로 API를 호출하지 않고, 자체 앱 서버에서 API를 호출하시기 바랍니다.
[Request]
GET/POST /v2/user/me HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer {access_token} Content-type: application/x-www-form-urlencoded;charset=utf-8
GET/POST /v2/user/me HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK {admin_key} Content-type: application/x-www-form-urlencoded;charset=utf-8
어드민 키(Admin Key)는 절대로 유출되어서는 안 되는, 일종의 마스터 키(Master Key)이므로 반드시 Third 서버에서 API를 호출해야 합니다. 어드민 키는 카카오 웹사이트의 내 애플리케이션에서 확인할 수 있습니다. 만약 iOS, Android 애플리케이션의 소스코드 내에서 어드민 키를 사용할 경우, 해당 애플리케이션은 보안에 취약할 수 있습니다.
사용자 정보 요청에는 두가지 방법이 있는데 액세스토큰을 이용한 방법으로 요청해보겠습니다.
[Response]
사용자 정보 요청이 성공하면 응답 바디에 JSON 객체로 아래 값을 포함합니다.
키 | 설명 | 타입 |
---|---|---|
id | 유저의 고유 ID | signed int64 |
properties | 사용자의 정보. Json 형태의 key-value. 사용자 정보 키를 지정한 경우는 해당 키에 대한 정보만 포함 합니다. |
String |
kakao_account.has_email | 카카오계정의 이메일 소유 여부. 전화번호로 카카오계정을 생성하고, 추후에도 이메일 입력을 하지 않은 카카오계정인 경우 이메일이 존재하지 않습니다. has_email=false인 경우 is_email_valid,is_email_verified, email 값은 응답에 포함되지 않습니다. | Boolean |
kakao_account.is_email_valid | 카카오계정의 이메일 유효 여부. 간혹 이메일 실소유자에 의해 카카오계정 이메일이 무효화 되는 경우 값이 false로 내려갑니다. | Boolean |
kakao_account.is_email_verified | 인증받은 카카오계정 이메일인지 여부 | Boolean |
kakao_account.email | 사용자 카카오계정의 이메일 - 카카오계정 이메일은 변경될 수 있습니다. - 이메일 개인정보 제공동의를 하지 않은 사용자의 이메일은 제공되지 않습니다. has_email=true인데 email값이 내려오지 않는다면, 사용자가 정보제공 동의를 하지 않은 경우입니다. |
String |
kakao_account.has_age_range | 카카오계정의 연령대 소유 여부. - has_age_range=false인 경우 age_range 값이 내려가지 않습니다. |
Boolean |
kakao_account.age_range | 사용자 카카오계정의 연령대. 15~19/20~19/30~39 ... 80~89/90~ | String |
kakao_account.has_birthday | 카카오계정의 생일 소유 여부. - has_birthday=false인 경우 birthday 값이 내려가지 않습니다. |
Boolean |
kakao_account.birthday | 사용자 카카오계정의 생일. MMDD 형식 | String |
kakao_account.has_gender | 카카오계정의 성별 소유 여부. - has_gender=false인 경우 gender 값이 내려가지 않습니다. |
Boolean |
kakao_account.gender | 사용자 카카오계정의 성별. female/male | String |
HTTP/1.1 200 OK { "id":123456789, "properties":{ "nickname":"홍길동", "thumbnail_image":"http://xxx.kakao.co.kr/.../aaa.jpg", "profile_image":"http://xxx.kakao.co.kr/.../bbb.jpg", "custom_field1":"23", "custom_field2":"여" ... }, "kakao_account": { "has_email": true, "is_email_valid": true, "is_email_verified": true, "email": "xxxxxxx@xxxxx.com" "has_age_range":true, "age_range":"20~29", "has_birthday":true, "birthday":"1130", "has_gender":true, "gender":"female" } }
이렇게 JSON형태로 응답받을 수 있습니다. 여기서 필요한 정보만 가져오면 되겠죠?
마찬가지로 다음은 컨트롤러에서 요청하기 위해 만든 클래스입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
package com.bit.ms.social.kakao;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
public class KakaoUserInfo {
public static JsonNode getKakaoUserInfo(JsonNode accessToken) {
final String RequestUrl = "https://kapi.kakao.com/v2/user/me";
final HttpClient client = HttpClientBuilder.create().build();
final HttpPost post = new HttpPost(RequestUrl);
// add header
post.addHeader("Authorization", "Bearer " + accessToken);
JsonNode returnNode = null;
try {
final HttpResponse response = client.execute(post);
final int responseCode = response.getStatusLine().getStatusCode();
System.out.println("\nSending 'POST' request to URL : " + RequestUrl);
System.out.println("Response Code : " + responseCode);
// JSON 형태 반환값 처리
ObjectMapper mapper = new ObjectMapper();
returnNode = mapper.readTree(response.getEntity().getContent());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// clear resources
}
return returnNode;
}
}
|
cs |
다음은 컨트롤러에서 JSON객체 형식으로 가져오면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// access_token을 통해 사용자 정보 요청
JsonNode userInfo = KakaoUserInfo.getKakaoUserInfo(accessToken);
// Get id
String id = userInfo.path("id").asText();
String name = null;
String email = null;
// 유저정보 카카오에서 가져오기 Get properties
JsonNode properties = userInfo.path("properties");
JsonNode kakao_account = userInfo.path("kakao_account");
name = properties.path("nickname").asText();
email = kakao_account.path("email").asText();
System.out.println("id : " + id);
System.out.println("name : " + name);
System.out.println("email : " + email);
|
cs |
저는 일부분의 정보만 가져왔지만 필요하다면 자신에게 맞게 정보를 활용하시면 되겠습니다.
카카오Developers에 들어가시면 더 많은 정보가 있으니 참고하시기 바랍니다.
'Web' 카테고리의 다른 글
[Eclipse] properties 확장자 파일 한글깨짐 해결방법 (0) | 2020.01.10 |
---|---|
[Spring] The import org.springframework.web.bind.annotation.RequestMapping cannot be resolved, RequestMapping cannot be resolved to a type 오류 해결방법 (0) | 2019.01.23 |
[Spring] 카카오 로그인 연동 구현하기(REST API) [3] (2) | 2018.12.09 |
[Spring] 카카오 로그인 연동 구현하기(REST API) [2] (2) | 2018.12.09 |
[Spring] 카카오 로그인 연동 구현하기(REST API) [1] (0) | 2018.12.09 |
댓글