[NuxtJS - Axios - Spring]: заголовок X-XSRF-TOKEN не установлен в первом запросе - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь реализовать веб-приложение, используя nuxtjs с axios в качестве внешнего интерфейса и Spring в качестве внутреннего. Бэкэнд защищен базовой аутентификацией и защитой csrf с использованием файла cookie XSRF-TOKEN и X-XSRF-TOKEN в заголовке запроса.

Однако у меня возникает следующая проблема:

  • Когда клиент отправляет первый запрос бэкэнду, предварительный запрос проходит, однако фактический запрос не выполняется с кодом состояния 403
  • Когда клиент затем отправляет второй запрос, предварительный просмотр и фактический запрос проходят

После некоторой отладки:

  • Я заметил, что браузер устанавливает cookie XSRF-TOKEN после первого запроса (я полагаю, после предварительного запроса)
  • Фактический запрос(который не выполняется) не содержит заголовок X-XSRF-TOKEN
  • Следовательно, имеет смысл, что запрос не выполняется
  • Второй запрос содержит правильный заголовок X-XSRF-TOKEN

Поскольку это обычно работает, я не верю, что это проблема бэкэнда. Но я не уверен. Я посмотрел в документации, но не могу найти решение.

Любая помощь очень ценится, спасибо.

Предполетный запрос первого запроса enter image description here Фактический первый запрос enter image description here Печенье после первого запроса enter image description here Предполётный запрос второго запроса enter image description here Фактический второй запрос enter image description here Печенье после второго запроса enter image description here

Реализация запроса Axios

    return $axios({
      method: 'delete',
      url: 'todo/' + id,
      auth: credentials,
      withCredentials: true
    })

Конфигурация безопасности Spring

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/todo/**").authenticated().and().httpBasic();
        http.cors().and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }

    @Bean
    public UserDetailsService userDetailsService() {
        String username = "user";
        String password = "password";
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        String encodedPassword = passwordEncoder().encode(password);
        manager.createUser(User.withUsername(username).password(encodedPassword).roles("USER").build());
        return manager;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Конфигурация Spring CORS

@Configuration
public class WebCorsConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/todo/**").allowedOrigins("http://localhost:3000").allowCredentials(true).allowedMethods("*");
    }

}
...