[토큰 요청]
2탄에서 토큰을 요청하기 위해 컨트롤러를 사용했다. 그러면 컨트롤러로 @Autowired 된 service 부분을 살펴보자
@Autowired
private LoginService loginService;
// 토큰을 요청하여 얻음
String kakaoToken = loginService.requestToken(code);
System.out.println("카카오토큰" + kakaoToken);
주석을 달아 놓았지만 조금 더 자세하게 설명해 보자면 2탄 마지막쯤에 언급했던 본문의 필수 내용들을 모두 가지고 요청을 해야 한다.
파라미터를 세팅 해주어야 한다. 문자 입력 스트림에서 텍스트를 읽고 문자, 배열, 행(lines)을 효율적으로 읽을 수 있게 문자를 버퍼링 해주는 BufferedWriter를 이용하고 가변(mutable)한 문자열을 처리하기 위한 클래스 StringBuilder를 사용한다.
// 인증코드로 token요청하기
public String requestToken(String code) {
String access_Token = "";
String refresh_Token ="";
String strUrl = "https://kauth.kakao.com/oauth/token"; // 토큰 요청 보낼 주소
KakaoToken kakaoToken = new KakaoToken(); // 요청받을 객체
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // url Http 연결 생성
// POST 요청
conn.setRequestMethod("POST");
conn.setDoOutput(true);// outputStreamm으로 post 데이터를 넘김
// 파라미터 세팅
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
StringBuilder sb = new StringBuilder();
문자열의 파라미터로 grant_type, client_id, redirecdt_uri, code 를 append 해준다. 그리고 카카오디벨로퍼스 문서에 의하면 token 발급 시 보안을 위해 Client Secret 키를 이용할 수 있다고 나와 있어서 같이 파라미터로 보내 주었다.
// 0번 파라미터 grant_type. -> authorization_code로 고정
sb.append("grant_type=authorization_code");
// 1번 파라미터 client_id
sb.append("&client_id=본인의 REST API 키");
// 2번 파라미터 redirect_uri
sb.append("&redirect_uri=redirct_uri");
// 3번 파라미터 code
sb.append("&code=" + code);
sb.append("&client_secret=보안의 클라이언트 시크릿 키 ");
BufferedWriter는 버퍼를 잡아 놓기 때문에 flush() / close() 를 반드시 호출해 주어 뒤처리를 해주어야 하므로 뒤처리를 해준다
bw.write(sb.toString());
bw.flush();// 실제 요청을 보내는 부분
요청을 보낸 후 응답코드가 200이나 500,401 등 다양하게 도착 할 수 있는데 확인을 위해 log를 한번 찍어 준다.
// 실제 요청을 보내는 부분, 결과 코드가 200이라면 성공
int responseCode = conn.getResponseCode();
log.info("responsecode(200이면성공): {}", responseCode);
여기까지 하면 토큰을 보내서 응답 결과를 얻어 오는 것까지 성공이다. 200으로 아주 잘 받아 온다.
이제는 그러면 토큰 값을 읽어오는 것을 실행 해 보자!
Respose 메세지를 읽어오기 위해 BufferReader를 사용했고 모든 라인을 읽어 드린다.
// 요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
String result = "";
while ((line = br.readLine()) != null) {
result += line;
}
log.info("response body: {}", result);
response body 에 access_token 값을 잘 받아 오는 것을 확인할 수 있다. 그러면 이 Json 파싱을 이용해 안의 값을 빼내어 보자
전달 받은전달받은 카카오 토큰의 값을 받기 위해 아래와 같은 클래스를 미리 만들어 두었다. 이 클래스를 이용해서 전달받은 내용들을 담는다.
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class KakaoToken {
private String token_type;
private String access_token;
private Integer expires_in;
private String refresh_token;
private Integer refresh_token_expires_in;
private String scope;
}
ObjectMapper를 이용해 JSON 형식의 응답들을 직렬화한다.
// json 파싱할 것임
ObjectMapper mapper = new ObjectMapper();
// kakaoToken에 result를 KakaoToken.class 형식으로 변환하여 저장
kakaoToken = mapper.readValue(result, KakaoToken.class);
System.out.println(kakaoToken);
// api호출용 access token
access_Token = kakaoToken.getAccess_token();
// access 토큰 만료되면 refresh token사용(유효기간 더 김)
refresh_Token = kakaoToken.getRefresh_token();
log.info(access_Token);
log.info(refresh_Token);
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
log.info("카카오토큰생성완료");
return access_Token;
}
그렇다면 이렇게 직렬화 하여 값을 담은 kakaoToken을 볼 수 있고 log를 찍은 값을 확인할 수 있다.
KakaoToken(token_type=bearer, access_token=Lj7oaJZVWwPvJwVV4QcGjawqV0i7fXi5gTJW5ezbCisNHwAAAYkeV4NI, expires_in=21599, refresh_token=hLZ3lqLLo_Jf7vW08LR70Ab2GkBFEqvvii5flD4eCisNHwAAAYkeV4NG, refresh_token_expires_in=5183999, scope=account_email profile_nickname)
이렇게 마지막 로그 "카카오토큰생성완료" 까지 진행 완료~
[2m2023-07-04T09:39:59.736+09:00[0;39m [32m INFO[0;39m [35m26664[0;39m [2m---[0;39m [2m[nio-8181-exec-1][0;39m [36mc.example.demo.kakaologin.LoginService [0;39m [2m:[0;39m 카카오토큰생성완료
'프로젝트 > Plan + tiful (플랜티플)' 카테고리의 다른 글
[Rest Api] vue와 Spring boot를 이용한 카카오톡 로그인 api 구현 (5) - 가져온 사용자 정보를 DB에 저장하기 (0) | 2023.07.07 |
---|---|
[Rest Api] vue와 Spring boot를 이용한 카카오톡 로그인 api 구현 (4) - 응답 받은 토큰 값으로 사용자 정보 가져오기 (0) | 2023.07.05 |
[Rest Api] vue와 Spring boot를 이용한 카카오톡 로그인 api 구현 (2) (1) | 2023.07.01 |
[Rest Api] vue와 Spring boot를 이용한 카카오톡 로그인 api 구현 (1) (1) | 2023.06.29 |
파이널 프로젝트 : Plantiful (0) | 2023.06.28 |