문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.
___ 앱 아이디 : 1058078
안녕하세요 Oauth Access Token을 이용하여 사용자 정보를 가져오는 방식을 구현하고있습니다.
블로거 분의 코드 예제를 진행하던 도중
org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [no body]
오류가 발생했습니다.
@Controller
public class UserController {
@GetMapping("/auth/joinForm") // 회원가입하는데 인증필요없으므로 /auth
public String joinForm() {
return "user/joinForm";
}
@GetMapping("/auth/loginForm")
public String loginForm() {
return "user/loginForm";
}
@GetMapping("/auth/kakao/callback")
public @ResponseBody String kakaoCallback(String code) throws JsonProcessingException { //Data리턴함수
//Post 방식으로 Key=value 데이터 요청 하기 위한
//RestTemplate, http 요청을 위함이다.
RestTemplate rest = new RestTemplate();
//Http POST 요청을 위해 보내는 데이터를 설명해주는 헤더
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
// body 데이터를 담을 오브젝트, MultiValueMap
// body는 보통 key, value 형태 이기 때문에 String, String
MultiValueMap<String, String > params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", "클라이언트 아이디 들어가는 곳 입니다.");
params.add("redirect_uri", "http://localhost:8080/auth/kakao/callback");
params.add("code", code);
// 해당내용은 카카오 에서 제공하는 내용.
// 요청하기위해 헤더와 데이터를 합침
// KakaoTokenRequest는 문서에 적혀있는 내용에서는 데이터와 헤더를 합쳐서 Entitiy로 사용.
HttpEntity<MultiValueMap<String, String>> kakaoTokenRequest = new HttpEntity<>(params, headers);
//Post 방식으로 Http 요청 response 변수의 응답을 받음.
ResponseEntity<String> response = rest.exchange(
"https://kauth.kakao.com/oauth/token", //https://{요청할 서버 주소}
HttpMethod.POST, // 요청할 방식
kakaoTokenRequest, // 요청할 때 보낼 데이터
String.class // 요청 시 반환되는 데이터 타입
);
ObjectMapper objectMapper = new ObjectMapper();
OAuthToken oauthToken =null;
try {
oauthToken = objectMapper.readValue(response.getBody(), OAuthToken.class);
} catch (JsonMappingException e){
e.printStackTrace();
} catch (JsonProcessingException e){
e.printStackTrace();
}
String AccessToken = oauthToken.getAccess_token();
RestTemplate rest2 = new RestTemplate();
HttpHeaders headers2 = new HttpHeaders();
headers2.add("Authorization","Bearer"+AccessToken);
headers2.add("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
HttpEntity<MultiValueMap<String,String>> kakaoProfileRequest = new HttpEntity<>(headers2);
ResponseEntity<String> response2 = rest2.exchange(
"https://kapi.kakao.com/v2/user/me",
HttpMethod.POST,
kakaoProfileRequest,
String.class
);
return response.getBody();
}
}
사용 코드는 위와 같습니다.