-
Sneakers Mania - 카카오 로그인(4)Projects/Problem & Solution 2021. 12. 28. 15:01
액세스 토큰 자바 객체로 매핑
1. OAuthToken 클래스 생성
@Data public class OAuthToken { private String access_token; private String token_type; private String refresh_token; private int expires_in; private String scope; private int refresh_token_expires_in; }
ㆍ 카카오 서버로부터 전달받은 액세스 토큰을 자바 객체로 매핑하기 위한 클래스를 생성한다.
2. 자바 객체로 매핑
ObjectMapper objectMapper = new ObjectMapper(); OAuthToken oAuthToken = objectMapper.readValue(response.getBody(), OAuthToken.class);
ㆍ 카카오 측에서 전달받은 코드 정보를 ObjectMapper 라이브러리를 통해 OAuthToken 객체로 변환한다.
액세스 토큰을 통한 사용자 정보 받기
1. 사용자 정보 요청
ㆍ 액세스 토큰을 통해 사용자 정보를 요청하기 위해서는 위 사진과 같이 카카오 측에서 제공하는 양식을 이용해야 한다.
RestTemplate rt02 = new RestTemplate();
ㆍ 액세스 토큰을 요청할 때와 마찬가지로 RestTemplate 객체를 생성한다.
HttpHeaders headers02 = new HttpHeaders(); headers02.add("Authorization", "Bearer " + oAuthToken.getAccess_token()); headers02.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
ㆍ HTTP 통신에 필요한 HttpHeaders 오브젝트를 생성하고, 카카오 측에서 요구한 Authorization과 Content-type을 설정한다.
HttpEntity<MultiValueMap<String, String>> kakaoProfileRequest = new HttpEntity<>(headers02);
ㆍ HttpHeaders를 하나의 오브젝트로 담기 위해 HttpEntity 타입으로 선언한다.
ㆍ 사용자 프로필을 요청하기 위한 HttpBody는 필요 없기 때문에 생성하지 않는다.
ResponseEntity<String> response02 = rt02.exchange( "https://kapi.kakao.com/v2/user/me", // 요청 주소 HttpMethod.POST, // method 방식 kakaoProfileRequest, // 전달 데이터 String.class // 응답받을 데이터 타입 );
ㆍ 사용자 정보 요청 주소에 POST 방식으로 위에서 만든 HttpEntity를 전달한다.
2. 테스트
ㆍ 로그인 페이지에서 카카오 로그인 버튼을 클릭한다.
ㆍ 카카오 로그인 버튼을 클릭하면 카카오 로그인을 수행할 수 있는 페이지가 나온다.
ㆍ 본인의 카카오 계정을 통해서 로그인을 수행한다.
ㆍ 카카오 로그인을 성공적으로 수행한 사용자의 정보가 올바르게 출력되고 있음을 확인할 수 있다.
카카오 로그인 사용자 강제 회원가입 진행
ㆍ 카카오 로그인을 성공적으로 수행한 사용자에 대해 강제적으로 회원가입을 진행한다.
ㆍ 회원가입을 진행하기 위해서 위 사진에 표시된 것처럼 사용자의 id와 email 정보를 사용할 예정이다.
1. KakaoProfile 클래스 생성
@Data public class KakaoProfile { public Integer id; public String connected_at; public Properties properties; public KakaoAccount kakao_account; @Data public class Properties { public String nickname; } @Data public class KakaoAccount { public Boolean profile_nickname_needs_agreement; public Profile profile; public Boolean has_email; public Boolean email_needs_agreement; public Boolean is_email_valid; public Boolean is_email_verified; public String email; @Data public class Profile { public String nickname; } } }
ㆍ 카카오 서버로부터 전달받은 사용자 정보를 자바 객체로 매핑하기 위한 클래스를 생성한다.
ㆍ 위 사이트를 사용하면 좀 더 손쉽게 JSON 객체를 자바 코드로 변경시킬 수 있다.
2. 강제 회원가입 진행
ObjectMapper objectMapper02 = new ObjectMapper(); KakaoProfile kakaoProfile = objectMapper02.readValue(response02.getBody(), KakaoProfile.class);
ㆍ 카카오 측으로부터 받은 사용자 정보를 ObjectMapper 라이브러리를 통해 KakaoProfile 객체로 변환한다.
User kakaoUser = User.builder() .username(kakaoProfile.getKakao_account().getEmail() + "_" + kakaoProfile.getId()) .password(passwordKey) .oauth("kakao") .build();
ㆍ 사용자의 email과 id를 조합하여 임의의 username을 생성한다.
ㆍ 또한, password는 개발자가 보관하고 있는 passwordKey로 설정한다.
ㆍ 이때, passwordKey는 외부에 노출이 되어서는 안 된다.
ㆍ 마지막으로, oauth 속성을 "kakao"로 설정함으로써 카카오 로그인을 통한 사용자라는 것을 명시해준다.
User originUser = userService.getUser(kakaoUser.getUsername()); if (originUser.getUsername() == null) userService.join(kakaoUser); Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(kakaoUser.getUsername(), passwordKey)); SecurityContextHolder.getContext().setAuthentication(authentication);
ㆍ 회원가입을 위한 User 객체가 다 만들어졌으며, 기존의 DB에 동일한 사용자 있는지 검사하는 과정이 필요하다.
ㆍ 기존의 DB에 동일한 사용자가 없을 경우 회원가입을 진행한다.
ㆍ 마지막으로 Authentication 객체를 생성하고, SecurityContextHolder에 집어넣음으로써 로그인 처리를 해준다.
3. 테스트
ㆍ 로그인 페이지에서 카카오 로그인 버튼을 클릭한다.
ㆍ 카카오 로그인 버튼을 클릭하면 카카오 로그인을 수행할 수 있는 페이지가 나온다.
ㆍ 본인의 카카오 계정을 통해서 로그인을 수행한다.
ㆍ 카카오 로그인이 성공적으로 수행이 되고, 마이페이지를 확인해보면 카카오 email과 id 조합으로 username이 생성된 것을 확인할 수 있다.
ㆍ 마지막으로, 데이터베이스를 확인해보면 카카오 로그인 사용자에 대한 회원가입 정보가 제대로 저장되었음을 확인할 수 있었다.
728x90'Projects > Problem & Solution' 카테고리의 다른 글
Sneakers Mania - @ControllerAdvice, @ExceptionHandler를 이용한 전역 예외 처리 (0) 2022.01.03 Sneakers Mania - ENUM 타입을 이용한 사용자 권한 처리 (0) 2021.12.31 Sneakers Mania - 카카오 로그인(3) (0) 2021.12.27 Sneakers Mania - 카카오 로그인(2) (0) 2021.12.27 Sneakers Mania - 카카오 로그인(1) (0) 2021.12.27