앞서서 살펴본 도면을 다시 리마인드해보자!
액세스 토큰을 요청하면, 카카오 서버에서 유저 정보를 받아올 수 있다.
이번에는 액세스 토큰을 이용해서 유저 정보를 받아보자.
매커니즘 자체는 앞에서 했던 방식과 동일하다.
public Map<String, Object> getUserInfo(String access_Token) {
//요청하는 클라이언트마다 가진 정보가 다를 수 있기에 HashMap 타입으로 선언
Map<String, Object> userInfo = new HashMap<>();
String reqURL = "https://kapi.kakao.com/v2/user/me"; //카카오 사이트에 있는 req 정보
try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
//요청에 필요한 Header에 포함될 내용
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
int responseCode = conn.getResponseCode();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
JsonElement element = JsonParser.parseString(result);
JsonObject jsonObject = element.getAsJsonObject();
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakao_account = jsonObject.getAsJsonObject().get("kakao_account").getAsJsonObject();
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
String profile_image = properties.getAsJsonObject().get("profile_image").getAsString();
String email = kakao_account.getAsJsonObject().get("email").getAsString();
String id = jsonObject.getAsJsonObject().get("id").getAsString();
userInfo.put("nickname", nickname);
userInfo.put("email", email);
userInfo.put("profile_image", profile_image);
userInfo.put("id", id);
System.out.println("-----------------------");
System.out.println(userInfo);
//{profile_image=http://t1.kakaocdn.net/account_images/default_profile.jpeg.twg.thumb.R640x640, nickname=?��?��?��, id=3469395348, email=sspure1214@naver.com}
//이제 custom tocken만 받아오면 된다.
System.out.println("-----------------------");
} catch (IOException e) {
e.printStackTrace();
}
return userInfo;
}
Map<String, Object> userInfo = new HashMap<>();
String reqURL = "https://kapi.kakao.com/v2/user/me"; //카카오 사이트에 있는 req 정보
try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
//요청에 필요한 Header에 포함될 내용
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
int responseCode = conn.getResponseCode();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
우선 공식문서에 따르면, 사용자 정보를 가져오기 위해서는 "https://kapi.kakao.com/v2/user/me"를 통해서 유저 정보를 가져와야 한다.
또한, GET 방식으로 가져와야 하기 때문에 conn.setRequestMethod("GET");을 통해 GET으로 연결해준다.
또한, 문서에 명시된 것과 같이, header에 access token을 담아서 response를 요청해야 한다. 그러므로, 다음과 같이 requestProperty를 설정한다.
//요청에 필요한 Header에 포함될 내용
conn.setRequestProperty("Authorization", "Bearer " + access_Token);
String line;
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
JsonElement element = JsonParser.parseString(result);
JsonObject jsonObject = element.getAsJsonObject();
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakao_account = jsonObject.getAsJsonObject().get("kakao_account").getAsJsonObject();
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
String profile_image = properties.getAsJsonObject().get("profile_image").getAsString();
String email = kakao_account.getAsJsonObject().get("email").getAsString();
String id = jsonObject.getAsJsonObject().get("id").getAsString();
이 부분은 왜 이렇게 구성했는지 이해하려면, response로 날라오는 응답의 형태를 이해해야 한다.
{
"id":123456789,
"connected_at": "2022-04-11T01:45:28Z",
"kakao_account": {
// 프로필 또는 닉네임 동의항목 필요
"profile_nickname_needs_agreement ": false,
// 프로필 또는 프로필 사진 동의항목 필요
"profile_image_needs_agreement ": false,
"profile": {
// 프로필 또는 닉네임 동의항목 필요
"nickname": "홍길동",
// 프로필 또는 프로필 사진 동의항목 필요
"thumbnail_image_url": "http://yyy.kakao.com/.../img_110x110.jpg",
"profile_image_url": "http://yyy.kakao.com/dn/.../img_640x640.jpg",
"is_default_image":false,
"is_default_nickname": false
},
// 이름 동의항목 필요
"name_needs_agreement":false,
"name":"홍길동",
// 카카오계정(이메일) 동의항목 필요
"email_needs_agreement":false,
"is_email_valid": true,
"is_email_verified": true,
"email": "sample@sample.com",
// 연령대 동의항목 필요
"age_range_needs_agreement":false,
"age_range":"20~29",
// 출생 연도 동의항목 필요
"birthyear_needs_agreement": false,
"birthyear": "2002",
// 생일 동의항목 필요
"birthday_needs_agreement":false,
"birthday":"1130",
"birthday_type":"SOLAR",
// 성별 동의항목 필요
"gender_needs_agreement":false,
"gender":"female",
// 카카오계정(전화번호) 동의항목 필요
"phone_number_needs_agreement": false,
"phone_number": "+82 010-1234-5678",
// CI(연계정보) 동의항목 필요
"ci_needs_agreement": false,
"ci": "${CI}",
"ci_authenticated_at": "2019-03-11T11:25:22Z",
},
"properties":{
"${CUSTOM_PROPERTY_KEY}": "${CUSTOM_PROPERTY_VALUE}",
...
},
"for_partner": {
"uuid": "${UUID}"
}
}
즉, 우리가 가져오고자 하는 email등의 정보는 kakao_account 내부에 또 다른 json으로 묶여 있기 때문에 우선 kakao_account를 가져온 다음, 그 내부에서 또 가져와야 한다.
또한, properties 내부에는 email 등의 정보가 들어있으므로, 이를 얻어오기 위해서는 여기서 정보를 가져와야 한다.
자, 그럼 이렇게 사용자 정보를 가져오는 것도 전부 마쳤다! 마지막으로 customToken을 얻기 위해 firebase와 연동하는 작업을 진행하면 로그인은 마무리된다:)