이 포스팅은 단계 3번이다. 프로세스 전체 개요 및 이전 단계를 확인하고 싶으면 아래 게시글에서 확인이 가능하다.
https://skylarcoding.tistory.com/342

접근토큰 요청 변수
프론트에서 받아온 code 와 status 값을 이용해 접근토큰을 발행해야 한다. 프론트에서 Callback 으로 전달받은 정보 (code, status) 를 이용해 접근 토큰을 발급받는다. 해당 값들은 최초 1번만 수행할 수 있으며 재사용이 불가능하다.

접근토큰 링크 샘플
접근토큰을 요청하기 위한 링크 샘플은 이와 같다.
https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id=jyvqXeaVOVmV&client_secret=527300A0_COq1_XV33cf&code=EIc5bFrl4RibFls1&state=9kgsGTfH4j7IyAkg
요청 응답 정보

구현 코드
NaverTokenResponse
코드 내에서 하나하나 Map 으로 반환하기에는 값이 복잡할 것 같아서 Entity class 를 따로 생성하여 결과 값을 받아오는 것으로 결정했다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class NaverTokenResponse {
@JsonProperty("access_token")
private String accessToken;
@JsonProperty("refresh_token")
private String refreshToken;
@JsonProperty("token_type")
private String tokenType;
@JsonProperty("expires_in")
private String expiresIn;
@JsonProperty("error")
private String error;
@JsonProperty("error_description")
private String errorDescription;
}
UserService.getNewAccessToken
신규 토큰을 발급받는 코드이다. apiKey 는 이 링크에서 어떻게 담고 있는지 확인할 수 있다. 작동 원리는 요청문 샘플을 코드로 구현하는 것이다. 나는 StringBuilder 을 이용해 링크를 구현했는데, 다양한 방법이 있으니 참고하면 된다.
// callback 이후 접근 신규 토큰 발급 요청
@Transactional
public NaverTokenResponse getNewAccessToken(String code, String state, String platform) {
Map<String, Object> result = new HashMap<>();
String clientId = apiKey.getNaver_client_id();
String clientSecret = apiKey.getNaver_client_secret();
try {
StringBuilder apiURL = new StringBuilder();
apiURL.append("https://nid.naver.com/oauth2.0/token?");
apiURL.append("&grant_type=authorization_code"); // 발급
apiURL.append("&client_id=").append(clientId);
apiURL.append("&client_secret=").append(clientSecret);
apiURL.append("&code=").append(code);
apiURL.append("&state=").append(state);
RestTemplate restTemplate = new RestTemplate();
// TODO 경로 requestentity 로 옮겨주기
ResponseEntity<String> response = restTemplate.exchange(apiURL.toString(), HttpMethod.GET, null, String.class);
// JSON 결과값 반환
String responseBody = response.getBody();
ObjectMapper objectMapper = new ObjectMapper();
NaverTokenResponse naverTokenResponse = objectMapper.readValue(responseBody, NaverTokenResponse.class);
System.out.println("접근 토큰 : " + response.getBody());
System.out.println("naverTokenResponse : "+ naverTokenResponse);
return naverTokenResponse;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
UserController
(생략)
// 1. 접근 토큰 신규 발급
NaverTokenResponse accessTokenResult = userService.getNewAccessToken(code, state, "NAVER");
System.out.println("accessToken="+accessTokenResult);
// 접근 토큰 에러 시 리턴
if (accessTokenResult.getError() != null) {
rtn.put("error", "accessToken Error");
}
// accessToken 만료 시 재발급
int expires_in = Integer.parseInt(accessTokenResult.getExpiresIn());
if ( expires_in <= 0) {
accessTokenResult = tokenService.getAccessTokenByRefreshToken();
}
(생략)
에러 처리는 구현되어 있지 않으니 해당 부분은 따로 구현하면 된다. 경로를 requestentity 로 옮겨서 템플릿 내에 넣으려고 했는데 귀찮아서 그냥 작성한다.
다음 편에서는 접근토큰으로 네이버 프로필 조회를 구현해볼 것이다.
아래에서 접근토큰부분 개발 가이드를 확인할 수 있다.
네이버 로그인 개발가이드 - LOGIN
네이버 로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아이디
developers.naver.com