카카오 로그인을 FeignClient로 바꿀 것이다.
먼저 /oauth/token
을 통해서 액세스 토큰을 가져오자.
먼저 Header
와 Body
에 어떤 값이 들어가야 하는 지를 체크한다.
그 다음에 콜백 경로를 /feign/kakao
로 가게 하기 위해 콜백 경로를 하나 더 추가해준다.
KReqTokenClient.java
package com.example.flux.feign.social.kakao;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "kakaoAccessToken", url= "${kakao.authUrl}")
public interface KReqTokenClient {
@PostMapping(consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
KakaoTokens requestAccessToken(
@RequestParam(name = "grant_type") String grantType,
@RequestParam(name = "client_id") String clientId,
@RequestParam(name = "redirect_uri") String redirectUri,
@RequestParam(name = "code") String code
);
}
KakaoTokens.java
package com.example.flux.feign.social.kakao;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
public class KakaoTokens {
@JsonProperty("access_token")
private String accessToken;
@JsonProperty("token_type")
private String tokenType;
@JsonProperty("refresh_token")
private String refreshToken;
@JsonProperty("expires_in")
private String expiresIn;
@JsonProperty("refresh_token_expires_in")
private String refreshTokenExpiresIn;
@JsonProperty("scope")
private String scope;
}
KakaoFeignService.java
package com.example.flux.feign.social.kakao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class KakaoFeignService {
private final KReqTokenClient KReqTokenClient;
private static final String GRANT_TYPE = "authorization_code";
@Value("${kakao.api}")
private String apiUrl;
@Value("${kakao.redirectUri}")
private String redirectUri;
@Value("${kakao.clientId}")
private String clientId;
public KakaoFeignService(KReqTokenClient KReqTokenClient) {
this.KReqTokenClient = KReqTokenClient;
}
public String requestAccessToken(String code) {
return KReqTokenClient.requestAccessToken(GRANT_TYPE, clientId, redirectUri, code).getAccessToken();
}
}
KakaoFeignController.java
package com.example.flux.feign.social.kakao;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class KakaoFeignController {
private final KakaoFeignService kakaoFeignService;
public KakaoFeignController(KakaoFeignService kakaoFeignService) {
this.kakaoFeignService = kakaoFeignService;
}
@GetMapping("/feign/kakao")
public String processKakao(@RequestParam("code") String code) {
String accessToken = kakaoFeignService.requestAccessToken(code);
return "카카오 엑세스 토큰은 : " + accessToken;
}
}
위 에러는 @FeignClient
에 url
속성을 추가하지 않아서 생긴 이슈라고 한다.
name과 url은 중복되지 않는 필수값으로 넣어주어야 한다.
결과적으로 아래와 같이 액세스 토큰을 얻는데 성공했다.
+) test를 위한 로그인 url은 아래와 같다. {}는 구분을 위한 것이니 빼자.
https://kauth.kakao.com/oauth/authorize
?client_id={실제 클라이언트 id}
&redirect_uri={redirect uri}
&response_type=code
&scope=talk_message&email