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");
}
}
NaverOAuth2User.java
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.");
}
}
}