Защищенный Spring boot API JS fetch() возвращает html страницы входа в систему

#javascript #spring-boot #fetch

#javascript #spring-boot #выборка

Вопрос:

Приложение Spring boot имеет некоторые REST API, которые защищены аутентификацией. Если я войду в систему и получу доступ к API-интерфейсам из браузера, все будет работать нормально. Но если я вызываю API-интерфейсы из вызова JavaScript fetch() из другого источника, он возвращает страницу входа, а не запрошенные данные. Как правило, это происходит, если я получаю доступ к любой странице, защищенной аутентификацией, когда я не входил в систему. Поэтому я предполагаю, что функция JS fetch () не отправляет файлы cookie.

Но добавление credentials: 'include' заголовков не решает проблему.

Моя конфигурация веб-безопасности —

 @Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) {
        try {
            http.cors()
                    .and()
                .authorizeRequests()
                    .antMatchers("/admin", "/api/**", "/admin/**").authenticated()
                    .antMatchers("/**").permitAll()
                        .and()
                    .formLogin()
                        .loginPage("/login")
                        .permitAll()
                        .and()
                    .csrf().disable();
        } catch (Exception e) {
            System.out.println("Exception occured during handling security: "   e);
        }
    }

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user = 
                User.withDefaultPasswordEncoder()
                    .username("user")
                    .password("pass")
                    .roles("USER")
                    .build();
        
        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://127.0.0.1:8090"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}
 

И моя команда fetch () —

 fetch(url, {
            method: 'GET',
            credentials: 'include'
       }).then(response => {
        response.text().then(data => {
            console.log(data);
...
 

Верно ли мое предположение?

Как мне решить эту проблему?

Комментарии:

1. Это не проблема выборки для отправки файлов cookie, я думаю, что сеанс вашего браузера не включает файлы cookie. Когда вы входите в систему, делая запрос POST, в нем также должны быть указаны конкретные учетные данные. Можете ли вы запросить аутентификацию, используя REST маршрут, а не логин, а затем нажать на GET маршрут?

2. @AshishYadav Если я правильно понял ваш комментарий, да, я могу это сделать. После выхода из системы я могу нажать на API, и он перенаправит меня на вход в систему. После успешного входа в систему он возвращается с запрошенной информацией в браузере в формате JSON, как и ожидалось. Но через JS fetch() это не работает таким образом.