본문 바로가기
Spring/Spring Boot

[Spring boot - OAuth2] Google Login 구현 #2

by seoyamin 2023. 2. 8.

오늘은 구글 로그인으로 회원 정보를 받아올 것이다.

 

 

1. SecurityConfig 설정

// SecurityConfig.java


// [추가 1]
@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")  
                .defaultSuccessUrl("/")

                .and()
                .oauth2Login()
                .loginPage("/loginForm")
                .userInfoEndpoint()                             // [추가 2]
                .userService(principalOauth2UserService);       // [추가 3]
    }

 

 

2. PrincipalOAuth2UserService 추가

// config/oauth/PrincipalOAuth2UserService.java

import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {

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

 

※  loadUser 뜯어보기

1 ) userRequest.getClientRegistration

어떤 OAuth로 로그인했는지 확인 가능 ( registrationId='google' )

 

2 ) super.loadUser(userRequest).getAttributes( )

sub : Google상의 사용자 번호
name : 사용자 이름
picture : 프로필 사진 url 
emal : 사용자 이메일
....

 

 

3. Flow 

구글 로그인 버튼 클릭 → 구글 로그인 창 등장 → 로그인 완료 → code 리턴 → OAuth-Client 라이브러리가 code 받음 →  code가지고 AccessToken 요청 → UserRequest 정보 → loadUser 메소드 → 구글로부터 회원 프로필 가져오기