본문 바로가기

GAB STORY

일상 속 소소한 순간들과 개발 공부 과정에서의 다양한 경험들을 담아낸 공간입니다.
DEVELOPE/Kotlin & Spring

커스텀하게 작성한 OAuth2UserService가 Google OAuth2에서 동작하지 않는 이유

by 갑스토리 2023. 10. 11.

Google OAuth2을 구현할 때 OAuth2UserService을 Implements한 CustomUserService가 실행되지 않고 OidcUserService가 대신 실행되는 문제가 있었다.

 

@Service
class CustomUserService  : OAuth2UserService<OAuth2UserRequest, OAuth2User> {
    override fun loadUser(userRequest: OAuth2UserRequest): OAuth2User {
      
    }
}

 

 

OAuth2 Login은 OAuth2LoginAuthenticationFilter.attemptAuthentication()이 실행되면서 동작한다.

이때 clientRegistration을 확인하면 scope 영역에 openid, profile, email 정보가 포함된 것을 확인할 수 있다.

ClientRegistration clientRegistration = this.clientRegistrationRepository.findByRegistrationId(registrationId);

 

호출 코드를 조금더 살펴보면 다음의 순서로 실행된다.

OAuth2LoginAuthenticationFilter.attemptAuthentication() 
    -> AuthenticationManager.authenticate() (ProviderManager) 
        -> OAuth2LoginAuthenticationProvider.authenticate()

 

주석의 내용을 보면 openID 인증 요청은 null을 반환하여 OidcAuthroizationCodeAthenticationProfider가 처리하도록 위임한다고 한다.

 This is an OpenID Connect Authentication Request so return null and let OidcAuthorizationCodeAuthenticationProvider handle it instead

public class OAuth2LoginAuthenticationProvider implements AuthenticationProvider {

    @Override
	public Authentication authenticate(Authentication authentication) throws AuthenticationException {
		OAuth2LoginAuthenticationToken loginAuthenticationToken = (OAuth2LoginAuthenticationToken) authentication;
		// Section 3.1.2.1 Authentication Request -
		// https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest scope
		// REQUIRED. OpenID Connect requests MUST contain the "openid" scope value.
		if (loginAuthenticationToken.getAuthorizationExchange().getAuthorizationRequest().getScopes()
				.contains("openid")) {
			// This is an OpenID Connect Authentication Request so return null
			// and let OidcAuthorizationCodeAuthenticationProvider handle it instead
			return null;
		}
		...
	}
  
}

 

 

즉, openID때문에 커스텀하게 생성한 UserService 대신 OidcUserService이 실행되는 것이다.

 

문제의 해결은 간단하다.

 

CommonOAuth2Provider.java에 scope 값이 없을 경우 Default 값을 사용하도록 하고 있으니 application.yaml파일에 scope을 넣으면 된다.

 

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            provider: "google"
            scope:
              - profile
              - email

 

 

 

참고

https://velog.io/@sussa3007/Spring-Spring-Security-OAuth2-%EA%B5%AC%ED%98%84%EC%A4%91-Google-Login-CustomUserService-%EB%A1%9C%EC%A7%81-%EB%8F%99%EC%9E%91%ED%95%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%AC%B8%EC%A0%9C

'DEVELOPE > Kotlin & Spring' 카테고리의 다른 글

kotlin에서 Clock 시간 Mocking하기  (0) 2021.11.10

댓글