소셜 로그인 구현하기
구글 클라우드 콘솔으로 접속하여 설정을 진행합니다.
상단의 [새프로젝트]를 클릭하여 프로젝트를 생성합니다.

이름을 설정하여 최종 생성을 진행합니다.

[좌상단 햄버거 버튼 클릭] - [API 및 서비스] - [OAuth 동의 화면] 클릭, 외부 옵션을 체크 후 [만들기] 클릭

다음 화면에 접속하여 사용자에게 보여줄 로그인 화면을 만듭니다.

[범위 추가 또는 삭제]를 클릭하여 제공받을 유저 정보의 scope를 설정해야합니다. 이 예제에서는 이메일과 프로필, 오픈아이디를 사용합니다. 체크한 후 밑의 [업데이트]를 클릭하여 반영합니다.

이후 테스트 사용자와 요약페이지는 건너뜁니다.
[사용자 인증 정보] - [사용자 인증 정보 만들기] - [OAuthClientID]를 클릭합니다.

애플리케이션 유형을 웹 애플리케이션, redirection url을 설정합니다.

생성된 클라이언트 ID와 보안 비밀번호를 확인하고 다른 파일에 복사해둡니다.
네이버 개발자 센터으로 이동합니다.
[Applicaion] - [애플리케이션 등록]으로 이동합니다.

[사용 API] - [네이버 로그인] 클릭한 후 다음과 같이 설정을 진행합니다.


클라이언트 ID와 시크릿을 확인합니다.

public interface ProviderUser {
public String getId();
public String getUsername();
public String getPassword();
public String getEmail();
public String getProvider();
public List<? extends GrantedAuthority> getAuthorities();
public Map<String, Object> getAttributes();
}
인터페이스로 기본 로직에 대한 골격을 작성합니다.
@Data
public abstract class OAuth2ProviderUser implements ProviderUser {
private Map<String, Object> attributes;
private OAuth2User oAuth2User;
private ClientRegistration clientRegistration;
public OAuth2ProviderUser(Map<String, Object> attributes, OAuth2User oAuth2User, ClientRegistration clientRegistration){
this.attributes = attributes;
this.oAuth2User = oAuth2User;
this.clientRegistration = clientRegistration;
}
@Override
public String getPassword() {
return UUID.randomUUID().toString();
}
@Override
public String getEmail() {
return (String)attributes.get("email");
}
@Override
public String getProvider() {
return clientRegistration.getRegistrationId();
}
@Override
public List<? extends GrantedAuthority> getAuthorities() {
return oAuth2User.getAuthorities().stream().map(authority -> new SimpleGrantedAuthority(authority.getAuthority())).collect(Collectors.toList());
}
}
추상 클래스를 활용해 공통 로직의 구현부를 미리 정의합니다.
public class GoogleUser extends OAuth2ProviderUser {
public GoogleUser(OAuth2User oAuth2User, ClientRegistration clientRegistration){
super(oAuth2User.getAttributes(), oAuth2User, clientRegistration);
}
@Override
public String getId() {
return (String)getAttributes().get("sub");
}
@Override
public String getUsername() {
return (String)getAttributes().get("sub");
}
}
각 벤더에 맞게끔 user 정보를 담을 구현체를 정의합니다. google의 경우 user정보로 id와 username을 제공하기 때문에 위와 같이 정의합니다.