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로 나온것을 확인할 수 있습니다)
이렇게 알아낸 정보로 회원관리 서비스를 작성하면 됩니다.
안되거나 궁금한 부분 있으면 댓글 달아주세요!
고생하셨습니다!
'web > Spring' 카테고리의 다른 글
checkbox와 스프링 (0) | 2022.06.28 |
---|---|
hhtp 요청 메세지 서버에서 보기 (0) | 2022.06.28 |
카카오 로그인 구현(4) - 카카오 토큰 받기 (0) | 2022.01.23 |
카카오 로그인 구현(3) - 인증코드받기 (0) | 2022.01.23 |
카카오 로그인 구현(2) - 애플리케이션 설정 (0) | 2022.01.23 |