해결된 질문
작성
·
3K
0
안녕하세요
강의와 자료를 보면서 차근차근 배워가고 있는 수강생입니다.
카카오 토큰 발금하기 강의를 듣는 과정에서 토큰을 받을때 Bad Client error가 발생했고, 이 문제를 해결하지 못하고 있어서 질문을 남깁니다.
현재 제가 작성한 코드 및 에러코드는 아래와 같습니다.
{"errorCode":"500 INTERNAL_SERVER_ERROR","errorMessage":"[401 Unauthorized] during [POST] to [https://kauth.kakao.com/oauth/token] [KakaoTokenClient#requestKakaoToken(String,Request)]: [{\"error\":\"invalid_client\",\"error_description\":\"Bad client credentials\",\"error_code\":\"KOE010\"}]"}
아래와 같은 글을 참고하여 에러를 해결해 보려고 했으나 잘 해결되지 않아 3일째 삽질중에 있습니다.
혹시 시간이 괜찮으시다면, 에러 원인에 대해서 한번 봐주실 수 있는지 여쭤보고자 질문을 남기게 되었습니다.
답변 1
0
캡처해준 사진을 보니까 clientSecret 값이 ${kakao.client.secret 이 값으로 전송되는게 아닌가 싶습니다. 카카오 개발자 센터에서 등록한 client secret값으로 전송하고 있는지 한번 더 확인해보셔야할꺼 같아요
client secret 값이 잘못되서 발생하는 오류가 아닌가 싶습니다! 그리고 client id도 카카오 개발자에서 직접 등록한 값으로 잘 넘기고 있는지도 한번 더 확인해주세요!
https://devtalk.kakao.com/t/koe010-bad-client-credentials/115388
loginForm.html 파일에 client_id 값을 제가 강의를 진행하면서 설정해둔 id를 사용하셨는데 혹시 그 값도 바꾸셨을까요??? 그리고 loginForm.html에 있는 redirect_uri도 동일하게 설정하셨을까요?
로컬에서 보내주신 client id 와 secret key로 잘 동작하고 있는데 아직 해결중이실까요??
client id : 7d892b8a5dd122bbcf555d990aee0308
client secret : ZV3hJ4wWwsKJcp13FotlspazJaGyzQm4
확인해보니까 KakaoTokenDto 문제더라구요 Request객체에 @Getter 어노테이션이 없었는데, FeignClient의 구현체가 post로 request body에 json 데이터를 만들어서 보낼 때 get메소드를 사용하는걸로 보입니다.
@Getter가 있을때는 아래 데이터를 보내는걸 볼 수 있었고, @Getter가 없을때는 보내는 데이터가 없더라구요!
{"access_token":"u_LsqY03dKcJraS--ydxLbc6G1_-4xjcZ5wr2kYfCj1y6gAAAYU0RbTC","token_type":"bearer","refresh_token":"maeDDQRnjYp-UGHb-SxzfzT60_zy30CwQcRt50guCj1y6gAAAYU0RbTA","expires_in":21599,"scope":"account_email profile_image profile_nickname","refresh_token_expires_in":5183999}
제가 첨부한 코드처럼 수정하시면 정상적으로 동작할것입니다.
public class KakaoTokenDto {
@Builder @Getter
public static class Request{
private String grant_type;
private String client_id;
private String redirect_uri;
private String code;
private String client_secret;
}
@ToString
@Builder @Getter
public static class Response{
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;
}
}
바쁘신 와중에 소스코드를 분석해주시고 해결점을 찾아봐 주셔서 감사합니다.
알려주신대로 소스를 수정후 다시 request를 했으나 이번에는 아래와 같은 에러가 발생하고 있습니다.
{"errorCode":"500 INTERNAL_SERVER_ERROR","errorMessage":"Type definition error: [simple type, class com.app.web.kakaotoken.dto.KakaoTokenDto$Response]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.app.web.kakaotoken.dto.KakaoTokenDto$Response` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]"}
lombok 문제라고 해서 지난 질문들을 찾아보던 중 아래의 글이 저의 현상과 비슷한것 같아
@AllArgsConstructor @NoArgsConstructor를 추가했습니다.
하지만 2개의 어노테이션을 추가하면 아래와 같은 에러메세지가 나옵니다.
constructor KakaoTokenDto() is already defined in class com.app.web.kakaotoken.dto.KakaoTokenDto
제가 lombok setting을 잘못 한것일까요...? 1.16 버전을 사용하면 위와 같은 에러가 종종 발생한다고들 하는데 저는 lombok 1.18.24 버전을 사용해서 어떤게 해당 에러를 발생시키는지 알기 힘드네요....
KakaoTokenDto에 @AllArgsConstructor @NoArgsConstructor를 추가하면 아래의 메세지가 나오구요.
constructor KakaoTokenDto() is already defined in class com.app.web.kakaotoken.dto.KakaoTokenDto
KakaoTokenDto에 @AllArgsConstructor @NoArgsConstructor를 제거하면 아래와 같이 나옵니다.
{"errorCode":"500 INTERNAL_SERVER_ERROR","errorMessage":"Type definition error: [simple type, class com.app.web.kakaotoken.dto.KakaoTokenDto$Response]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.app.web.kakaotoken.dto.KakaoTokenDto$Response
(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]"}
소스는 수정해서 다시 github에 올려놨습니다.
제 컴퓨터에서는 올려주신 소스코드로 잘 동작하고있는데, 환경이나 버전에 따라서 역직렬화를 할 때 기본생성자 관련해서 오류가 나시는 분들이 가끔씩 있더라구요.
@Builder 어노테이션을 사용할 때 @AllArgsConstructor @NoArgsConstructor 이 2개 어노테이션도 가능하면 같이 붙이시면 해결될것입니다.
public class KakaoTokenDto {
@Builder
@Getter
@AllArgsConstructor @NoArgsConstructor
public static class Request{
private String grant_type;
private String client_id;
private String redirect_uri;
private String code;
private String client_secret;
}
@ToString
@Builder @Getter
@AllArgsConstructor @NoArgsConstructor
public static class Response{
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;
}
}
안녕하세요.
정말로 감사합니다.
이제 제대로 Kakao 토큰이 제대로 발급되었습니다. 덕분에 다음 강의로 넘어갈 수 있을것 같습니다.
혹시 에러를 어떤 방식으로 파악하고 해결하셨는지 알 수 있을까요? 저는 아무리 Google을 뒤져봐도 Reference를 뒤져바도 원인 및 해결방법을 알 수 없었어서요.
에러 확인 및 해결 방법의 팁이 있다면 알고 싶습니다.
강의에서 제공해준 코드로 실행하셨을 때 Cannot construct instance of com.app.web.kakaotoken.dto.KakaoTokenDto$Response
(no Creators, like default constructor, exist): cannot deserialize from Object value 이 에러가 나오셨을텐데 보시면 KakaoTokenDto의 Response 객체를 만들 때 기본생성자가 없다고 나오는것을 보고 해결하였습니다!
롬복관련해서 참고할만한 게시글도 링크드립니다.
바쁘신 와중에 답글 남겨주셔서 감사합니다.
${kakao.client.secret에 }가 빠져 있었습니다.
하지만 다시 client_secret를 매핑해도 Bad client credentials는 해결되지 않는것 같습니다.....