본문 바로가기

web/Spring

카카오 로그인 구현(4) - 유저정보 알아내기

1. return값을 담을 domain 생성

@Getter @Setter @ToString
public class KakaoResult {
    Long id;
    String email;
    String nickname;
}

2. 유저정보 요청하기

//인증코드로 token요청하기
public User requestUser(String accessToken){
    log.info("requestUser 시작");
    String strUrl = "https://kapi.kakao.com/v2/user/me"; //request를 보낼 주소
    User user = new User(); //response를 받을 객체

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

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

        //전송할 header 작성, 인자로 받은 access_token전송
        conn.setRequestProperty("Authorization", "Bearer " + accessToken);


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

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

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

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


        //Jackson으로 json 파싱할 것임
        ObjectMapper mapper = new ObjectMapper();
        //결과 json을 HashMap 형태로 변환하여 resultMap에 담음
        HashMap<String,Object> resultMap = mapper.readValue(result, HashMap.class);
        //json 파싱하여 id 가져오기
        Long id = Long.valueOf(String.valueOf(resultMap.get("id")));

        //결과json 안에 properties key는 json Object를 value로 가짐
        HashMap<String,Object> properties = (HashMap<String, Object>) resultMap.get("properties");
        String nickname = (String)properties.get("nickname");

        //결과json 안에 kakao_account key는 json Object를 value로 가짐
        HashMap<String,Object> kakao_account = (HashMap<String, Object>) resultMap.get("kakao_account");
        String email=null;//이메일은 동의해야 알 수 있음
        if(kakao_account.containsKey("email")){//동의하면 email이 kakao_account에 key로 존재함
            email=(String)kakao_account.get("email");
        }
        
        //유저정보 세팅
        user.setEmail(email);
        user.setId(id);
        user.setNickname(nickname);

        log.info("resultMap= {}",resultMap);
        log.info("properties= {}",properties);


    }catch (IOException e) {
        e.printStackTrace();
    }
    return user;
}

 

 

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);

            //추가됨: 유저정보 요청
            User user = loginService.requestUser(kakaoToken.getAccess_token());
            log.info("user = {}",user);

        }
        return "redirectPage"; //만들어둔 응답받을 View 페이지 redirectPage.html 리턴
    }

 

 

3. 실행해봅니다

로그를 통해 유저 정보가 User 객체에 잘 들어와 있음을 확인할 수 있습니다.

(email은 수집 거절해서 null로 나온것을 확인할 수 있습니다)

 

이렇게 알아낸 정보로 회원관리 서비스를 작성하면 됩니다.

현재까지 진척도

안되거나 궁금한 부분 있으면 댓글 달아주세요!

 

고생하셨습니다!