Hello

8. 구글 회원 프로필 정보 받아보기

by 볼빵빵오춘기

OAuth 과정

일반적으로 구성은

  1. 코드 받는다. (= 인증 받기)
  2. 코드를 통해서 엑세스 토큰 받는다. (= 사용자정보에 접근할 권한을 받는다.)
  3. 사용자 정보를 가져온다.
  4. 그 정보를 토대로 회원가입을 자동으로 진행 or 추가 정보가 필요하다면 추가 정보를 받고 가입 진행한다.

SecurityConfig

구글 로그인 완료된 뒤 후처리가 필요한 상황 ⇒ 후처리 진행

구글 로그인이 완료가 되면 코드를 받는 것이 아니라 엑세서 토큰 + 사용자 프로필정보를 받는다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests()
            .antMatchers("/user/**").authenticated()
            .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .anyRequest().permitAll()
            .and()
            .formLogin()
            .loginPage("/loginForm")
            .loginProcessingUrl("/login") // login 주소가 호출이 되면 시큐리티가 낚아채서 대신 로그을 진행
            .defaultSuccessUrl("/")
            .and()
            .oauth2Login()
            .loginPage("/loginForm") // 구글 로그인이 완료된 뒤의 후처리가 필요함. Tip. 코드x, 액세스토큰+사용자정보를 한 방에
            .userInfoEndpoint()
            .userService(null); // Oauth2UserService 타입을 매개변수로 받아야한다. 우선은 null 로 진행
}

 

PrincipalOauth2UserService

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
}

 

SecurityConfig

@Autowired
private PrincipalOauth2UserService principalOauth2UserService;
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.authorizeRequests()
            .antMatchers("/user/**").authenticated()
            .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .anyRequest().permitAll()
            .and()
            .formLogin()
            .loginPage("/loginForm")
            .loginProcessingUrl("/login") // login 주소가 호출이 되면 시큐리티가 낚아채서 대신 로그을 진행
            .defaultSuccessUrl("/")
            .and()
            .oauth2Login()
            .loginPage("/loginForm") // 구글 로그인이 완료된 뒤의 후처리가 필요함. Tip. 코드x, 액세스토큰+사용자정보를 한 방에
            .userInfoEndpoint()
            .userService(principalOauth2UserService); // Oauth2UserService 타입을 매개변수로 받아야한다. 우선은 null 로 진행
}

 

PrincipalOauth2UserService

  • loadUser()에서 후처리가 되기에 오버라이드한다.
  • Run시켜 구글로 로그인을 해보면 Sysout로 출력을 통해 어떤 정보가 받아와 지는지 확인가능하다.
  • 받은 정보를 토대로 회원가입 진행하는데 이 정보를 통해서는 일반적인 사용자인지 OAuth로그인한 사용자인지 확인이 어렵다.
@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {

    // 구글로 부터 받은 userRequest 데이터에 대한 후처리되는 함수
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        System.out.println("userRequest : "+userRequest.getClientRegistration());
        System.out.println("userRequest : "+userRequest.getAccessToken().getTokenValue());
        System.out.println("userRequest : "+super.loadUser(userRequest).getAttributes());

        // 회원가입을 강제로 진행해 볼 예정
        return super.loadUser(userRequest);
    }
}

 

User

Oauth로그인 한 사람이면 provider 에 google, providerId에는 sub를 넣어줄것이다.

private String provider;
private String providerId;

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기