본문 바로가기

web/Spring

카카오 로그인 구현(4) - 카카오 토큰 받기

1. 토큰 받을 준비하기

response type에 맞는 domain(KakaoToken.java) 생성

@Getter @Setter @ToString

public class KakaoToken {
    String token_type;
    String access_token;
    Integer expires_in;
    String refresh_token;
    Integer refresh_token_expires_in;
    String scope;
}

 

2. 토큰 요청하기

LoginService.java 작성

requestToken 메소드는 인증코드를 인자로 받아 KakaoToken의 객체를 이용해 token을 리턴합니다.

@Slf4j
@Component
public class LoginService {
    private final LoginMapper loginMapper;

    public LoginService(LoginMapper loginMapper) {
        this.loginMapper = loginMapper;
    }

    //인증코드로 token요청하기
    public KakaoToken requestToken(String code){

        String strUrl = "https://kauth.kakao.com/oauth/token"; //request를 보낼 주소
        KakaoToken kakaoToken = new KakaoToken(); //response를 받을 객체

        try{
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //url Http 연결 생성

            //POST 요청
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);//outputStreamm으로 post 데이터를 넘김

            //파라미터 세팅
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
            StringBuilder sb = new StringBuilder();
            //0번 파라미터 grant_type 입니다 authorization_code로 고정이라니 고정등록해줍니다
            sb.append("grant_type=authorization_code");

            //1번 파라미터 client_id입니다. ***자신의 앱 REST API KEY로 변경해주세요***
            sb.append("&client_id=a527f058ade4d6b7075f0a57318df2d4");

            //2번 파라미터 redirect_uri입니다. ***자신의 redirect uri로 변경해주세요***
            sb.append("&redirect_uri=http://116.33.177.58:8080/member/kakaologin");

            //3번 파라미터 code입니다. 인자로 받아온 인증코드입니다.
            sb.append("&code=" + code);
            bw.write(sb.toString());
            bw.flush();//실제 요청을 보내는 부분

            //실제 요청을 보내는 부분, 결과 코드가 200이라면 성공
            int responseCode = conn.getResponseCode();
            log.info("responsecode(200이면성공): {}",responseCode);

            //요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = "";
            String result = "";

            while ((line = br.readLine()) != null) {
                result += line;
            }

            log.info("response body: {}",result);


            //Jackson으로 json 파싱할 것임
            ObjectMapper mapper = new ObjectMapper();
            //kakaoToken에 result를 KakaoToken.class 형식으로 변환하여 저장
            kakaoToken = mapper.readValue(result, KakaoToken.class);

            //api호출용 access token
            String access_Token = kakaoToken.getAccess_token();
            //access 토큰 만료되면 refresh token사용(유효기간 더 김)
            String refresh_Token=kakaoToken.getRefresh_token();


            
            log.info("access_token = {}",access_Token);
            log.info("refresh_token = {}", refresh_Token);
            
            br.close();
            bw.close();
        }catch (IOException e) {
            e.printStackTrace();
        }
        log.info("카카오토큰생성완료>>>{}",kakaoToken);
        return kakaoToken;
    }

 

LoginController 수정

(추가됨: 카카오 토큰 요청)

@Slf4j
@Controller
public class LoginController {
    private final LoginService loginService;

    public LoginController(LoginService loginService) {
        this.loginService = loginService;
    }

    //login 페이지 mapping
    @RequestMapping("/login")
    public String loginPage(){
        return "login";
    }


    //redirect 경로 mapping
    @RequestMapping("/login/kakao-redirect")
    public String kakaoLogin(@RequestParam(value = "code",required = false) String code){
        if(code!=null){
            System.out.println("code = " + code);

            //추가됨: 카카오 토큰 요청
            KakaoToken kakaoToken = loginService.requestToken(code);
            log.info("kakoToken = {}", kakaoToken);
        }
        return "redirectPage"; //만들어둔 응답받을 View 페이지 redirectPage.html 리턴
    }
}

 

 

3. 실행해봅니다

 

 

redirect 페이지에 따로 만들어 둔 게 없으시면 아무것도 안 뜨는 게 정상입니다. 
로그를 저와 똑같이 찍어두셨다면 대략 이런식으로 나옵니다.

 

 

현재까지 진척도

 

 

 

#아래는 코드 복사해서 쓰는데 오류가 나시는 분들만 보세요

Mapper 관련 세팅에 어려움을 겪는 분

@Mapper
public interface LoginMapper {
    //email 아는 회원가입
    @Insert("INSERT INTO temp_user(id,email,nickname) VALUES(${id},#{email},#{nickname})")
    int saveUserYesEmail(@Param("id")Long id, @Param("email") String email, @Param("nickname")String nickname);

    //email 모르는 회원가입
    @Insert("INSERT INTO temp_user(id,nickname) VALUES(${id},#{nickname})")
    int saveUserNoEmail(@Param("id")Long id, @Param("nickname")String nickname);



    //id로 유저 찾기
    @Select("SELECT * FROM temp_user WHERE id=${id}")
    User findUserById(@Param("id") Long id);



    //id로 유저 유무 체크
    @Select("SELECT COUNT(*) FROM temp_user WHERE id=${id}")
    int countUserById(@Param("id") Long id);

}

 

 

 

# 카카오 로그인 오류 디버깅 하는 방법

1. 에러코드를 찾습니다. 400 오류는 잘못된 요청입니다. 해당 요청을 웹브라우저에서 보내봅니다.

 

 

 

 

 

 

웹브라우저로 해당 요청을 보내보니 위와 같은 메세지가 나옵니다. error_code를 찾을 수 있엇습니다. error_code는 KOE010입니다. 기억해둡니다.

https://developers.kakao.com/docs/latest/ko/kakaologin/trouble-shooting

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

Kakao Developers의 문제해결 페이지에 가서 에러 코드를 검색해봅니다.

(링크가 안 들어가지면 Kakao Developers 홈 - 우측상단의 문서보기 클릭 - 카카오로그인 이해하기 클릭 - 좌측 하단에 문제해결 클릭)

 

 

문제해결 페이지에서 에러코드 검색

 

 

 

 

아하 그렇구나

 

 

 

파라미터 추가