코드 받기 (인증)
액세스 토큰 받기 (권한)
사용자 프로필(이메일,이름,아이디,전화번호 까지만) 정보 가져옴
그 정보를 토대로 회원 가입 자동 진행도 함.
추가적인 정보(집 주소 등)가 필요하다면 추가적인 회원가입 절차가 필요함.
DefaultOAuth2UserService 를 상속한 클래스를 @Service로 등록하자.
그리고 loadUser()라는 메서드를 재정의하자.
이 메서드는 구글 Oauth 로그인 이후의 후처리를 담당한다.
@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
//구글로부터 받은 userRequest 데이터에 대한 후처리를 담당하는 메서드
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
System.out.println("getClientRegistration : "+userRequest.getClientRegistration());
System.out.println("getAccessToken : "+userRequest.getAccessToken());
//구글 로그인 버튼 클릭 -> 구글 로그인 창 -> 로그인 완료-> code를 리턴 -> Oauth라이브러리가 받음 ->Access token 요청
//위 과정까지가 UserRequest 정보이다.
//이 UserRequest 정보를 이용해 회원프로필을 받아야하는데, 이때 사용되는게 이 loadUser() 메서드이다.
System.out.println("getAttributes : "+super.loadUser(userRequest).getAttributes());
return super.loadUser(userRequest);
}
}
userRequest.getClientRegistration()를 보면, registrationId를 이용해 어떤 Oauth로 로그인하였는지 알 수 있다.
loadUser().getAttributes()를 출력해보면 다음과 같은 형식으로 프로필 정보가 나온다.
sub는 구글 회원의 기본키라고 보면 된다.
{sub= ,
name= ,
given_name= ,
family_name= ,
picture= ,
email=,
email_verified= ,
locale=ko}
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private PrincipalOauth2UserService principalOauth2UserService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();//<-사이트 간 위조 요청 방지를 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")
.defaultSuccessUrl("/")
.and()
.oauth2Login()
.loginPage("/loginForm")
.userInfoEndpoint()//구글 로그인이 완료된 뒤 후처리 필요. 구글은 코드를 안주고 액세스 토큰 + 사용자 프로필 정보를 제공함.
.userService(principalOauth2UserService);
}
}
어플리케이션 테스트 시, 최초 로그인 이후에는 계정 선택 화면 선택 없이 자동 로그인이 된다.
이를 해제하는 방법은 다음을 참조하면 된다.
https://m.blog.naver.com/ezpbill/221799781305