spring security 설정 (4) - userinfo

진병욱·2023년 11월 7일

userinfo

  • 각 oauth2 provider를 분류하고, 이를 통해 제공 받은 정보를 활용하기 위한 설정

추상 클래스 정의

  • 기본적으로 모든 oauth2에서 활용할 정보들을 추상 클래스로 정의하여, 각 oauth2 클래스들에서 이를 반드시 구현하도록 함

Oauth2UserInfo.class

@Getter
@AllArgsConstructor
public abstract class OAuth2UserInfo {

    protected Map<String, Object> attributes;

    public abstract String getOAuth2Id();
    public abstract String getEmail();
    public abstract String getName();

    public abstract String getNickname();

    public abstract String profile_imgae();

    public abstract String getAge();

}

GoogleOAuth2User.java

  • 구글 로그인시에 필요한 정보들을 OAuth2UserInfo를 통해 상속받은 메소드들을 재정의, 추가적으로 필요한 정보들은 추가 메소드 구현
  • 각 객체로부터 정보를 불러와야 하는데 이러한 객체들은 oauth2 마다 정의 해 놓은 이름이 다르기 때문에, 이 외의 내용들은 추가 검색이 필요
public class GoogleOAuth2User extends OAuth2UserInfo {

    public GoogleOAuth2User(Map<String, Object> attributes) {
        super(attributes);
    }

    @Override
    public String getOAuth2Id() {
        return (String) attributes.get("sub");
    }

    @Override
    public String getEmail() {
        return (String) attributes.get("email");
    }

    @Override
    public String getName() {
        return (String) attributes.get("name");
    }


    public String getNickname() {
        return (String) attributes.get("name");
    }

    @Override
    public String profile_imgae() {
        return (String) attributes.get("picture");
    }

    @Override
    public String getAge() {
        return (String) attributes.get("age");
    }

}

KakaoOAuth2User.java

public class KakaoOAuth2User extends OAuth2UserInfo {

    private Long id;

    public KakaoOAuth2User(Map<String, Object> attributes) {
        super((Map<String, Object>) attributes.get("kakao_account"));
        log.warn(attributes.toString());
        this.id = (Long) attributes.get("id");
    }

    @Override
    public String getOAuth2Id() {
        return this.id.toString();
    }

    @Override
    public String getEmail() {
        return (String) attributes.get("email");
    }

    @Override
    public String getName() {
        return (String) ((Map<String, Object>) attributes.get("profile")).get("nickname");
    }


    public String getNickname() {
        return (String) ((Map<String, Object>) attributes.get("profile")).get("nickname");
    }

    @Override
    public String profile_imgae() {
        return (String) ((Map<String, Object>) attributes.get("profile")).get("profile_image_url");
    }

    @Override
    public String getAge() {
        return (String) ((Map<String, Object>) attributes.get("profile")).get("age_range");
    }

}
public class NaverOAuth2User extends OAuth2UserInfo {

    public NaverOAuth2User(Map<String, Object> attributes) {
        super((Map<String, Object>) attributes.get("response"));
    }

    @Override
    public String getOAuth2Id() {
        return (String) attributes.get("id");
    }

    @Override
    public String getEmail() {
        return (String) attributes.get("email");
    }

    @Override
    public String getName() {
        return (String) attributes.get("name");
    }


    public String getNickname() {
        return (String) attributes.get("nickname");
    }

    @Override
    public String profile_imgae() {
        return (String) attributes.get("profile_image");
    }

    @Override
    public String getAge() {
        return (String) attributes.get("age");
    }

}

각 oauth2 provider 구분을 위한 클래스 구현

OAuth2UserInfoFactory.class

public class OAuth2UserInfoFactory {

    public static OAuth2UserInfo getOAuth2UserInfo(AuthProvider authProvider, Map<String, Object> attributes) {
        switch (authProvider) {
            case NAVER: return new NaverOAuth2User(attributes);
            case KAKAO: return new KakaoOAuth2User(attributes);
            case GOOGLE: return new GoogleOAuth2User(attributes);

            default: throw new IllegalArgumentException("Invalid Provider Type.");
        }
    }
}
profile
새로운 기술을 접하는 것에 망설임이 없고, 부족한 것이 있다면 항상 배우고자 하는 열정을 가지고 있습니다!

0개의 댓글