지난 번에 학습한 내용과 같다. 이를 참고해서 제작해보자.
카카오 공식문서
위 사이트에서 카카오 개발자 회원가입 이후 내 애플리케이션을 들어가 추가해준다.
그럼 위와 같이 내가 만들려는 서비스 관련 앱 키를 확인할 수 있다. 우리는 SpringBoot를 활용하므로 이 중 REST API 키를 활용할 것이다.
왼쪽 메뉴바 중 카카오 로그인 항목이 있다. 이를 클릭해준 다음 활성화를 ON으로 바꿔주자.
그 아래에는 Redirect URI가 있는데, Redirect URI 등록해주면 된다.
일단은 Local 환경에서 테스트하기 위해 위처럼 작성했는데 각자 만든 홈페이지를 설정한 포트번호와 함께 입력해주면 된다.
이 URI는 사용자가 카카오 로그인을 수행했을 때 발급되는 code를 반환할 페이지이다.
이후 왼쪽 메뉴 중 제품설정 내 동의항목을 클릭하여 불러올 정보들을 선택해주면 된다. 기본적으로 클론코딩하는 당근마켓에서 닉네임, 프로필 사진을 필요로 하므로 두 개의 정보를 필수 정보를 갖고 오게 한 뒤 차후 휴대전화 번호 분실 시 사용할 카카오 계정을 설정하였다.
이렇게 되면 1차 설정은 끝이다.
코드를 입력하세요
kauth.kakao.com/oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code
위 링크를 이용해 카카오 로그인을 할 수 있다.
REST_API_KEY는 내 애플리케이션 화면에서 확인했던 값, redirect_uri는 설정했던 uri 값으로 입력하면 된다.
위와 같이 링크로 정상적으로 이동하면 화면을 볼 수 있다. Accept All을 체크하고 넘어가보자.
그럼 위처럼 코드를 Query String으로 갖는 홈페이지로 redirect된다.
위 링크를 이용해서 code를 확인할 수 있다..
아래 코드로 이 code를 따로 추출해보자.
@RestController
@AllArgsConstructor
@RequestMapping("/oauth")
public class OAuthController {
/**
* 카카오 callback
* [GET] /oauth/kakao/callback
*/
@ResponseBody
@GetMapping("/kakao")
public void kakaoCallback(@RequestParam String code) {
System.out.println(code);
}
}
터미널 창에서 따로 code만 불러왔다. 이처럼 이 code를 활용하여 회원가입 또는 로그인 API를 구현할 수 있을 것이다.
이제 인가코드(code)를 받았으니, 이 코드로 카카오서버에 인가토큰(access token)을 요청할 수 있다. POST로 요청하고, 결과를 JSON형식으로 받기 때문에 JSON파싱에 유용한 Gson라이브러리를 사용해보겠다.
Gson 추가
Gradle:
dependencies { implementation 'com.google.code.gson:gson:2.8.7' }
Maven:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.7</version>
</dependency>
필자는 Gradle을 이용해서 아래처럼 추가 이후 새로고침을 하였다.
이제 code를 이용하여 access token을 발급받는 Service파일을 작성해보자
OAuthService.java
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;
@Service
public class OAuthService{
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=e4a81d5a6acbda948310e08e2eafc123"); // TODO REST_API_KEY 입력
sb.append("&redirect_uri=http://localhost:9000/oauth/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;
}
}
위 코드를 해석하면 아래와 같은 순으로 진행된다고 한다.
1. connection 생성
2. POST로 보낼 Body 작성
3. 받아온 결과 JSON 파싱 (Gson)
위 코드를 수정해서 확인해보자.
이후 이를 controller에서 호출하여 확인해보자.
터미널 창에 관련 정보를 확인할 수 있다.
이제 이러한 정보들을 확인하여 로그인이나 회원가입 method를 제작하면 된다.
https://suyeoniii.tistory.com/81
https://velog.io/@shwncho/Spring-Boot-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-APIoAuth-2.0-2