[오류 해결] Request: "{"error":"invalid_grant","error_description":"Redirect URI mismatch.","error_code":"KOE303"}"

Yu Seong Kim·2024년 3월 22일

요기조기

목록 보기
3/4

요기조기 프로젝트를 진행하면서 카카오로그인을 구현하고 있었습니다.
프론트에서 받은 인가코드로 액세스토큰을 받아야 하는데...


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을 정확히 다 맞춰야 된다는 것을 깨달았습니다. 조금더 꼼꼼히 봅시다 ㅎ

profile
Development Record Page

0개의 댓글