예전에 oAuth 2.0 개념에 대해서 공부를 하고, 지금은 그것에 대한 실전편이라고 보면 된다.
개념적인 부분은 이전에 설명했기 때문에 링크로 대체한다.
-> https://velog.io/@shwncho/UMC-7%EC%A3%BC%EC%B0%A8
사실 구현은 어제 했지만,, 좀 더 공부해볼게 있었다.
이 과정은 클라이언트 없이 백엔드 혼자서 kakao login API를 만들어보는 과정입니다.
https://developers.kakao.com/docs/latest/ko/kakaologin/common
앱 이름과 사업자명은 본인이 편한대로 짓고 저장하면
이렇게 본인 앱의 요약 정보가 나온다.
Rest API를 만드는 것이므로, 여기서 우리가 사용할 것은 "REST API 키"
로그인을 하게되면 Redirect URI를 통해 우리가 얻으려는 code(인가코드)를 반환받는것으로 생각하면 된다.
나는 이메일 부분만 받아서 구현하겠다. 다른 부분은 선택해도 상관은 없지만, 나중에 코드로 받아와서 어떻게 처리할지도 알아야 한다.
웹 주소창에 밑에 있는 URI를 입력하면되는데,
kauth.kakao.com/oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code
위에서 우리 앱에 할당받은 Rest API key와, 우리가 설정한 Redirect URI를 넣어주면된다.(중괄호는 당연히 없애고,,)
** 주의 - 포스트맨 or index.jsp에서 경로를 넣어줄 때는 반드시 https://를 앞에 붙여줘야 한다.
위 or 밑에 사진이 떠서 로그인을 진행하면 리다이렉트된 URI가 나오고,
여기서 인가코드(Code)를 받게 된다.
@ResponseBody
@GetMapping("/kakao")
public void kakaoCallback(@RequestParam String code) throws BaseException {
System.out.println(code);
}
위 코드를 통해 콘솔창에 code가 출력되는 것을 확인할 수 있다.
(나는 @Requestsmapping으로 /app/users가 설정되어있다.
이제 받은 인가코드를 통해 access_token을 받을 수 있다.
나는 gradle을 이용해 프로젝트를 만들었으므로, gradle에 의존성을 추가하겠다.
implementation'com.google.code.gson:gson:2.8.7'
import com.google.gson.JsonParser;
import com.google.gson.JsonElement;
import org.springframework.stereotype.Service;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public String getKaKaoAccessToken(String code){
String access_Token="";
String refresh_Token ="";
String reqURL = "https://kauth.kakao.com/oauth/token";
try{
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//POST 요청을 위해 기본값이 false인 setDoOutput을 true로
conn.setRequestMethod("POST");
conn.setDoOutput(true);
//POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
StringBuilder sb = new StringBuilder();
sb.append("grant_type=authorization_code");
sb.append("&client_id=fadeb1cea8077be1a20d8cc98139a990"); // TODO REST_API_KEY 입력
sb.append("&redirect_uri=http://localhost:9000/app/users/kakao"); // TODO 인가코드 받은 redirect_uri 입력
sb.append("&code=" + code);
bw.write(sb.toString());
bw.flush();
//결과 코드가 200이라면 성공
int responseCode = conn.getResponseCode();
System.out.println("responseCode : " + responseCode);
//요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
System.out.println("response body : " + result);
//Gson 라이브러리에 포함된 클래스로 JSON파싱 객체 생성
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
access_Token = element.getAsJsonObject().get("access_token").getAsString();
refresh_Token = element.getAsJsonObject().get("refresh_token").getAsString();
System.out.println("access_token : " + access_Token);
System.out.println("refresh_token : " + refresh_Token);
br.close();
bw.close();
}catch (IOException e) {
e.printStackTrace();
}
return access_Token;
}
주의: JsonElement와 JsonParser는 gson 라이브러리 인 것을 한 번 더 확인하자. (따라 치거나 복사 붙여넣기로 인해 JsonParser를 다른 라이브러리로 import해서 생기는 오류를 못찾는 문의가 몇 번 있었다.)
위 코드는 다른 블로그들을 참고했다.
이제 성공의 결과로
200번대가 나오면 성공, 400번대가 나오면 실패인데 구글링을 통해서도 충분히 많은 해결책들이 제시되어있고, 카카오개발자페이지 에서도 FAQ도 많이 제공되어있다.
참고사이트:
https://suyeoniii.tistory.com/79?category=858035
https://antdev.tistory.com/36?category=807235
저도 잘 참고할게요!