소프트웨어 마에스트로에서 "온라인 강의 큐레이션 서비스 - curady"를 개발하며 생긴 일
구글 로그인을 위한 각종 설정을 모두 잘 해주었고, redirect_uri도 몇번을 확인했다.
그러나 구글 서버로 oauth 토큰 요청을 보냈을 때 에러가 발생했다.
"malformed auth code" error
흉측한 코드????
위 에러에 대해 찾아보니,
구글 로그인 api는 인증 과정에서 요청 간 인증코드를 변경한다.
토큰을 얻기 위한 첫 번째 요청에 대해서 구글은 정상적인 문자열을 반환하지만
n번째 요청(취소되지 않은 경우) 에는 인증 코드를 url-encoded로 반환한다.
내 경우에는 '%4F'가 붙어서 왔다.
문제는 구글 API의 작동 방식에 대한 오해였다.
항상 URL-인증 코드를 액세스 토큰으로 교환하기 전에 디코딩 해주는 작업이 필요했다.
아래와 같이 수정해서 문제를 해결했다.
public OAuthRequest getRequest(String code, String provider) {
LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>();
if (provider.equals("kakao")) {
map.add("grant_type", "authorization_code");
map.add("client_id", kakaoInfo.getKakaoClientId());
map.add("redirect_uri", kakaoInfo.getKakaoRedirect());
map.add("code", code);
return new OAuthRequest(kakaoInfo.getKakaoTokenUrl(), map);
} else {
map.add("grant_type", "authorization_code");
map.add("client_id", googleInfo.getGoogleClientId());
map.add("client_secret", googleInfo.getGoogleClientSecret());
map.add("redirect_uri", googleInfo.getGoogleRedirect());
// 디코딩 !!
map.add("code", java.net.URLDecoder.decode(code, StandardCharsets.UTF_8));
return new OAuthRequest(googleInfo.getGoogleTokenUrl(), map);
}