ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;
            }
        }
    }

    카카오 서버로부터 전달받은 사용자 정보를 자바 객체로 매핑하기 위한 클래스를 생성한다.

     

     

    jsonschema2pojo

    Reference properties For each property present in the 'properties' definition, we add a property to a given Java class according to the JavaBeans spec. A private field is added to the parent class, along with accompanying accessor methods (getter and sette

    www.jsonschema2pojo.org

    위 사이트를 사용하면 좀 더 손쉽게 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이 생성된 것을 확인할 수 있다.

     

     

    마지막으로, 데이터베이스를 확인해보면 카카오 로그인 사용자에 대한 회원가입 정보가 제대로 저장되었음을 확인할 수 있었다.


     

    GitHub - qlsdud0604/sneakers-mania: 👟 신발 사진을 업로드하고 소통할 수 있는 커뮤니티

    👟 신발 사진을 업로드하고 소통할 수 있는 커뮤니티. Contribute to qlsdud0604/sneakers-mania development by creating an account on GitHub.

    github.com

     

    728x90

    댓글

Designed by Tistory.