본문 바로가기

카테고리 없음

소셜 로그인은 어렵다

우선 로그인 버튼을 구현을 하려면 프론트를 만져야만 한다.

리소스 파일 안에 templates를 만들고, 그 안에 index.html을 만든다.

 

 

 

@Configuration
@EnableWebSecurity
class SecurityConfig(
    private val jwtAuthenticationFilter: JwtAuthenticationFilter, // JwtAuthenticationFilter 의존성 주입
    private val authenticationEntryPoint: AuthenticationEntryPoint,
    private val accessDeniedHandler: AccessDeniedHandler
) {
    @Bean
    fun filterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .httpBasic { it.disable() }
            .formLogin { it.disable() }
            .csrf { it.disable() }
            .headers { it.frameOptions { options -> options.sameOrigin() } } // H2 Console을 위한 설정
            .authorizeHttpRequests {
                it.requestMatchers(
                    "/login", "/signup", "/swagger-ui/**", "/v3/api-docs/**"

                ).permitAll()
                    .anyRequest().authenticated()
            }
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java) // JWT 필터 추가
            .exceptionHandling {
                it.authenticationEntryPoint(authenticationEntryPoint)
                it.accessDeniedHandler(accessDeniedHandler)
            }
            .sessionManagement {
                it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 세션 상태를 Stateless로 설정
            }
            .build()
    }
}

 

그런데 이것만으론 소셜로그인이 안된다고 한다.

그래서 

 

@Configuration
@EnableWebSecurity
class SecurityConfig(
    private val jwtAuthenticationFilter: JwtAuthenticationFilter, // JwtAuthenticationFilter 의존성 주입
    private val authenticationEntryPoint: AuthenticationEntryPoint,
    private val accessDeniedHandler: AccessDeniedHandler,
    private val oAuth2UserService: OAuth2UserService,
    private val oAuth2LoginSuccessHandler: OAuth2LoginSuccessHandler,
) {
    @Bean
    fun filterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .httpBasic { it.disable() }
            .formLogin { it.disable() }
            .csrf { it.disable() }
            .headers { it.frameOptions { options -> options.sameOrigin() } } // H2 Console을 위한 설정
            .authorizeHttpRequests {
                it.requestMatchers(
                    "/login", "/signup", "/swagger-ui/**", "/v3/api-docs/**",  "/oauth2/login",
                    "/oauth2/callback/**",

                    ).permitAll()
                    .anyRequest().authenticated()
            }
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java)
            .exceptionHandling {
                it.authenticationEntryPoint(authenticationEntryPoint)
                it.accessDeniedHandler(accessDeniedHandler)
            }
            .oauth2Login { oauthConfig ->
                oauthConfig.authorizationEndpoint {
                    it.baseUri("/oauth2/login")
                }.redirectionEndpoint {
                    it.baseUri("/oauth2/callback/*")
                }.userInfoEndpoint {
                    it.userService(oAuth2UserService)
                }.successHandler(oAuth2LoginSuccessHandler)
            }
            .sessionManagement {
                it.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            }
            .build()
    }
}

 

이렇게 oAuth2UserService, OAuth2LoginSuccessHandler와 연결시키고

 

.oauth2Login { oauthConfig ->
                oauthConfig.authorizationEndpoint {
                    it.baseUri("/oauth2/login")
                }.redirectionEndpoint {
                    it.baseUri("/oauth2/callback/*")
                }.userInfoEndpoint {
                    it.userService(oAuth2UserService)
                }.successHandler(oAuth2LoginSuccessHandler)
            } 를 추가해 오어스와 욘굘시킨다. 

그런대, 그러자


Parameter 0 of method setFilterChains in org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration required a bean of type 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository' in your configuration.

 

이건 물어본 결과,

 

, ClientRegistrationRepository 타입의 빈이 필요하지만, 찾을 수 없다고 합니다. 이는 Spring Security가 OAuth2 클라이언트 등록 정보를 관리하기 위해 ClientRegistrationRepository 인터페이스의 구현체를 요구하는데, 이에 해당하는 설정이 Spring Application Context에 존재하지 않음을 의미합니다.

이 문제는 일반적으로 spring-boot-starter-oauth2-client 의존성이 프로젝트에 포함되어 있지 않거나, 올바르게 설정되지 않았을 때 발생할 수 있습니다.

 

그래서 해결책을 찾는 중이다.