요기조기 프로젝트를 진행하면서 카카오로그인을 구현하고 있었습니다.
프론트에서 받은 인가코드로 액세스토큰을 받아야 하는데...
2024-03-22 16:39:45.526 ERROR 21396 --- [nio-8080-exec-1] c.s.yogijogi.controller.SignController : Error during getAccessToken
org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: "{"error":"invalid_grant","error_description":"Redirect URI mismatch.","error_code":"KOE303"}"
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:101) ~[spring-web-5.3.12.jar:5.3.12]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:168) ~[spring-web-5.3.12.jar:5.3.12]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122) ~[spring-web-5.3.12.jar:5.3.12]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.3.12.jar:5.3.12]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:819) ~[spring-web-5.3.12.jar:5.3.12]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:777) ~[spring-web-5.3.12.jar:5.3.12]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711) ~[spring-web-5.3.12.jar:5.3.12]
이런 오류가 떴습니다. Redirect Url mismatch라 어느정도 감은 잡혔습니다.
프론트에서 보내준 redirect_uri
redirect_uri=https://localhost:3000/login
입니다.
여기서 저는 application.property에서 등록한 redirect_uri을 확인해 보았습니다.
kakao.redirect.uri= http://localhost:3000/
kakao.redirect.uri= http://localhost:3000/
-> kakao.redirect.uri= https://localhost:3000/login
으로 바꾸어 주고 컨트롤러를 만들어 테스트를 진행하였습니다.
-기존 getAccessToken-
@Override
public OauthToken getAccessToken(String code) {
RestTemplate rt = new RestTemplate();
rt.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type","application/x-www-form-urlencoded;charset=utf-8");
MultiValueMap<String,String> params = new LinkedMultiValueMap<>();
params.add("grant_type","authorization_code");
params.add("client_id",clientId);
params.add("redirect_uri",redirectUri);
params.add("code",code);
params.add("client_secret",clientSecret);
HttpEntity<MultiValueMap<String,String>> kakaoTokenRequest =
new HttpEntity<>(params,headers);
ResponseEntity<String> accessTokenResponse = rt.exchange(
"https://kauth.kakao.com/oauth/token",
HttpMethod.POST,
kakaoTokenRequest,
String.class
);
String reponseBody = accessTokenResponse.getBody();
// 객체로부터 JSON 형태의 문자열을 만들어냄 -> 직렬화
ObjectMapper objectMapper = new ObjectMapper();
OauthToken oauthToken = null;
try{
oauthToken = objectMapper.readValue(accessTokenResponse.getBody(), OauthToken.class);
}catch(JsonMappingException e){
e.printStackTrace();
}catch (JsonProcessingException e){
e.printStackTrace();
}
logger.info("[getAccessToken] accessToken :{} " , oauthToken.getAccess_token());
System.out.println("KakaoAccessToken : "+oauthToken.getAccess_token());
return oauthToken;
}
-TestController method-
@PostMapping("/kakao_access_token")
public ResponseEntity<OauthToken> getAccessToken(@RequestParam("code") String code){
try {
OauthToken oauthToken = signService.getAccessToken(code);
logger.info("[getAccessToken] accessToken : {} ", oauthToken);
return ResponseEntity.ok(oauthToken);
} catch (Exception e) {
logger.error("Error during getAccessToken", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
<결과 확인>

오류 해결!리다이렉트 url을 정확히 다 맞춰야 된다는 것을 깨달았습니다. 조금더 꼼꼼히 봅시다 ㅎ