FeignClient 입문 (2) - 카카오 로그인 AccessToken 조회

jinvicky·2024년 2월 1일
0

Spring & Java

목록 보기
17/23
post-thumbnail

Intro

카카오 로그인을 FeignClient로 바꿀 것이다.
먼저 /oauth/token을 통해서 액세스 토큰을 가져오자.

먼저 HeaderBody에 어떤 값이 들어가야 하는 지를 체크한다.


그 다음에 콜백 경로를 /feign/kakao로 가게 하기 위해 콜백 경로를 하나 더 추가해준다.

Code

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;
    }

}

☑️ 에러


위 에러는 @FeignClienturl 속성을 추가하지 않아서 생긴 이슈라고 한다.

참고 https://stackoverflow.com/questions/63702885/java-lang-illegalstateexception-no-feign-client-for-loadbalancing-defined-did

name과 url은 중복되지 않는 필수값으로 넣어주어야 한다.

결과적으로 아래와 같이 액세스 토큰을 얻는데 성공했다.

+) test를 위한 로그인 url은 아래와 같다. {}는 구분을 위한 것이니 빼자.

https://kauth.kakao.com/oauth/authorize
?client_id={실제 클라이언트 id}
&redirect_uri={redirect uri}
&response_type=code
&scope=talk_message&email

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글