SpringBoot
OAuthService.java
package com.majustory.k1.project;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class OAuthService {
public String getKakaoAccessToken (String code) {
String accessToken = "";
String refreshToken = "";
String requestURL = "https://kauth.kakao.com/oauth/token";
try {
URL url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
// setDoOutput()은 OutputStream으로 POST 데이터를 넘겨 주겠다는 옵션이다.
// POST 요청을 수행하려면 setDoOutput()을 true로 설정한다.
conn.setDoOutput(true);
// POST 요청에서 필요한 파라미터를 OutputStream을 통해 전송
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
String sb = "grant_type=authorization_code" +
"&client_id=레스트api키값 넣는 위치" + // REST_API_KEY
"&redirect_uri=리다이텍트URI넣는 위치" + // REDIRECT_URI
"&code=" + code;
bufferedWriter.write(sb);
bufferedWriter.flush();
int responseCode = conn.getResponseCode();
System.out.println("responseCode : " + responseCode);
// 요청을 통해 얻은 데이터를 InputStreamReader을 통해 읽어 오기
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
StringBuilder result = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
result.append(line);
}
System.out.println("response body : " + result);
JsonElement element = JsonParser.parseString(result.toString());
accessToken = element.getAsJsonObject().get("access_token").getAsString();
refreshToken = element.getAsJsonObject().get("refresh_token").getAsString();
System.out.println("액세스토큰 : " + accessToken);
System.out.println("리프레쉬토큰 : " + refreshToken);
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
return accessToken;
}
public HashMap<String, Object> getUserInfo(String accessToken) {
HashMap<String, Object> userInfo = new HashMap<>();
String postURL = "https://kapi.kakao.com/v2/user/me";
try {
URL url = new URL(postURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
int responseCode = conn.getResponseCode();
System.out.println("responseCode : " + responseCode);
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
StringBuilder result = new StringBuilder();
while ((line = br.readLine()) != null) {
result.append(line);
}
System.out.println("response body : " + result);
JsonElement element = JsonParser.parseString(result.toString());
JsonObject properties = element.getAsJsonObject().get("properties").getAsJsonObject();
JsonObject kakaoAccount = element.getAsJsonObject().get("kakao_account").getAsJsonObject();
String nickname = properties.getAsJsonObject().get("nickname").getAsString();
String email = kakaoAccount.getAsJsonObject().get("email").getAsString();
String gender = kakaoAccount.getAsJsonObject().get("gender").getAsString();
userInfo.put("nickname", nickname);
userInfo.put("email", email);
userInfo.put("gender", gender);
} catch (IOException exception) {
exception.printStackTrace();
}
return userInfo;
}
}
카카오디벨로퍼를 활용하여 로그인 코드를 붙여 구현을 해보았다.
setDoOutput()은 OutputStream으로 POST 데이터를 넘겨 주겠다는 옵션이고,POST 요청을 수행하려면 setDoOutput()을 true로 설정한다.
그리고 별칭과, 이메일 성별을 불러와 확인해 보았다.
pom.xml
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
먼저 pom.xml에 해당 내용을 추가하여 준다.
Maven을 통해 gson에 의존성을 부여한다.
Controller
@GetMapping("/kakao/kakaoLogin.do")
void kakaoLogin() {
}
@ResponseBody
@GetMapping("/kakao/kakaoLoginOK.do")
public void kakaoLoginOK(@RequestParam String code, Model model) {
System.out.println("코드 ==> " + code);
//코드 ----------
OAuthService service = new OAuthService();
String accessToken = service.getKakaoAccessToken(code);
HashMap<String, Object> userInfo = service.getUserInfo(accessToken);
//----------------------
System.out.println("유저인포 ==> " + userInfo);
//model.addAttribute("map", userInfo);
}
컨트롤러에 해당 내용을 추가하여 정상적으로 값이 들어오는지 콘솔에서 출력으로 확인했다.
주의할점은 Gson의존성 주입후 필드가 제대로 존재하는지, JSON 데이터의 구조와 일치하는지 확인해야한다.