8. 구글 회원 프로필 정보 받아보기
by 볼빵빵오춘기OAuth 과정
일반적으로 구성은
- 코드 받는다. (= 인증 받기)
- 코드를 통해서 엑세스 토큰 받는다. (= 사용자정보에 접근할 권한을 받는다.)
- 사용자 정보를 가져온다.
- 그 정보를 토대로 회원가입을 자동으로 진행 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
볼빵빵오춘기