[OAuth2와 JWT] 구글과 네이버 OAuth2 로그인

코린이서현이·2024년 6월 20일
0
post-thumbnail

들어가면서

한달만에 살이 너무 많이 쩌셔... 당황스러운데

로그인을 해보자

OAuth2로그인 과정은 이 목록 첫 파트에 가장 잘 나와있으니까 그걸 참고하면 될 것 같다.
따라서 주요로직정도만 살펴보자! 

DefaultOAuth2UserService 구현

  • DefaultOAuth2UserService 클래스의 loadUser메서드가 소셜 로그인의 사용자 유저 정보를 전달받아 처리를 하게 된다.

코드가 깔끔한 것 같지는 않아서 한 부분부분 설명을 하겠다!

OAuth2 로그인 후 호출받기

@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
    @Override
    //OAuth2 로그인 성공 후 실행되는 메서드 (이후 SecurityConfig 등록 예정)
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2User oAuth2User = super.loadUser(userRequest);

어떤 소셜을 통해 로그인이 진행되었는지 확인하기

  • 구글과 네이버 로그인을 다르게 처리하는데 이유는 둘의 형식이 다르기 때문이다.
String registrationID = userRequest.getClientRegistration().getRegistrationId();
        OAuth2Response oAuth2Response = null;

        if (registrationID.equals("naver")) {
            oAuth2Response = new NaverResponse(oAuth2User.getAttributes());
        } else if (registrationID.equals("google")) {
            oAuth2Response = new GoogleResponse(oAuth2User.getAttributes());
        } else {
            return null;
        }
  • 구글의 경우
{sub=114345949617548919515, name=진서현, given_name=서현, family_name=진, picture=https://lh3.googleusercontent.com/a/ACg8ocIbf__5_362xdsQqSFQ_MPmuH5AB4DNECjtdi08WZAJY-6MZg=s96-c, email=15roa1121@gmail.com, email_verified=true}
public class GoogleResponse implements OAuth2Response{

    private final Map<String, Object> attribute;

    public GoogleResponse(Map<String, Object> attribute) {

        this.attribute = attribute;
    }

    @Override
    public String getProvider() {
        return "google";
    }
    ~~나머지 메서드 생략~~

}

네이버의 경우

[{id=t3CIbWd0qvGF24X-A4O_xkXu8b386UXG0OnoQxwLfJs, email=jin011228@naver.com, name=진서현}], Granted Authorities: [[OAUTH2_USER]], User Attributes: [{resultcode=00, message=success, response={id=t3CIbWd0qvGF24X-A4O_xkXu8b386UXG0OnoQxwLfJs, email=jin011228@naver.com, name=진서현}}]
public class NaverResponse implements OAuth2Response {

    private final Map<String, Object> attribute;

    public NaverResponse(Map<String, Object> attribute) {
        this.attribute = (Map<String, Object>) attribute.get("response");
    }

    @Override

    public String getProvider() {
        return "naver";
    }

~~나머지 메서드 생략~~

}

회웝가입을 해야하는 경우

  • username을 만드는 로직이 있다.
    해당 회원이 DB에 존재하는지 검사한다.
		String username = oAuth2Response.getProvider() + " " + oAuth2Response.getProviderId();
        UserEntity existData = userRepository.findByUsername(username);

        if (existData == null) {
            //처음 로그인한 경우 -> 회원가입을 시켜야한다.
            UserEntity userEntity = new UserEntity();
            userEntity.setUsername(username);
            userEntity.setEmail(oAuth2Response.getEmail());
            userEntity.setName(oAuth2Response.getName());
            userEntity.setRole("ROLE_USER");

            userRepository.save(userEntity);

            UserDTO userDTO = new UserDTO();
            userDTO.setUsername(username);
            userDTO.setName(oAuth2Response.getName());
            userDTO.setRole("ROLE_USER");

            return new CustomOAuth2User(userDTO);

        } 

회원가입이 이미 된 경우

else {
            //이미 회원가입이 된 유저인 경우

            //이메일이 업데이트 되었을 수도 있으니까
            existData.setEmail(oAuth2Response.getEmail());
            existData.setName(oAuth2Response.getName());

            userRepository.save(existData);


            UserDTO userDTO = new UserDTO();
            userDTO.setUsername(existData.getUsername());
            userDTO.setName(oAuth2Response.getName());
            userDTO.setRole(existData.getRole());

            return new CustomOAuth2User(userDTO);
        }

나머지 내용은 깃허브를...

마무리하면서

하늘이 참 예쁘당
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글