문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.
앱ID : 704648
서비스 url : https://its-lil.com/
카카오 간편로그인에서 발생한 오류입니다.
안드로이드는 이상 없으나 ios에서 문제가 발생하고 있고, 사파리나 크롬 등 타브라우저에서는 문제없는데 카카오 인앱브라우저에서만 로그인이 안되고있습니다.
로그 확인 시 400 에러 발생하고있습니다.
//카카오 로그인
@RequestMapping(value = "/login/loginKakao")
public @ResponseBody String loginKakao(HttpServletRequest request
,HttpSession session
//,@RequestParam(value = "fnCallBack", required = false) String fnCallBack
) throws Exception {
String kakaoKey = configProperties.getString("kakao.key");
String kakaoCallback = configProperties.getString("kakao.callback");
//session.setAttribute("fnCallBack",fnCallBack);
String reqUrl =
"https://kauth.kakao.com/oauth/authorize"
+ "?client_id="+kakaoKey
+ "&redirect_uri="+kakaoCallback
+ "&response_type=code"
+ "&prompt=login";
return reqUrl;
}
// 카카오 로그인 callback
@RequestMapping(value = "/login/kakaoCallback")
public String kakaoCallback(
@RequestParam(value = "code", required = false) String code
,@RequestParam(value = "error", required = false) String error
,HttpSession session
,Model model) throws Exception {
//카카오인증 세션 초기화
session.removeAttribute("snsLoginId");
// 카카오로그인 페이지에서 취소버튼 눌렀을경우
if (error != null) {
if (error.equals("access_denied")) {
return "redirect:/index";
}
}
// System.out.println("####authorization_code#####" + code);
String authorization_code = code;
HashMap<String, Object> tokenInfo = getAccessToken(authorization_code);
System.out.println("###access_Token#### : " + tokenInfo.get("accessToken"));
System.out.println("###refresh_Token#### : " + tokenInfo.get("refreshToken"));
session.setAttribute("access_token", tokenInfo.get("accessToken"));
HashMap<String, Object> userInfo = getUserInfo((String)tokenInfo.get("accessToken"));
... 생략 ...
//토큰발급
public HashMap<String, Object> getAccessToken (String authorize_code) {
String access_Token = "";
String refresh_Token = "";
String reqURL = "https://kauth.kakao.com/oauth/token";
String kakaoKey = configProperties.getString("kakao.key");
String kakaoCallback = configProperties.getString("kakao.callback");
HashMap<String, Object> tokenInfo = new HashMap<String, Object>();
try {
URL url = new URL(reqURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// URL연결은 입출력에 사용 될 수 있고, POST 혹은 PUT 요청을 하려면 setDoOutput을 true로 설정해야함.
conn.setRequestMethod("POST");
conn.setDoOutput(true);
// POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
StringBuilder sb = new StringBuilder();
sb.append("grant_type=authorization_code");
sb.append("&client_id="+kakaoKey); //본인이 발급받은 key
sb.append("&redirect_uri="+kakaoCallback); // 본인이 설정해 놓은 경로
sb.append("&code=" + authorize_code);
bw.write(sb.toString());
bw.flush();
// 결과 코드가 200이라면 성공
int responseCode = conn.getResponseCode();
**System.out.println("responseCode : " + responseCode);**
... 생략
}
로그
responseCode : 400
java.io.IOException: Server returned HTTP response code: 400 for URL: https://kauth.kakao.com/oauth/token
전달 받은 인가코드를 한번 더 호출하는 구조가 아니여서 정확한 원인이 무엇인지 확인 부탁드리겠습니다.