Я пытаюсь реализовать веб-приложение, используя nuxtjs с axios в качестве внешнего интерфейса и Spring в качестве внутреннего. Бэкэнд защищен базовой аутентификацией и защитой csrf с использованием файла cookie XSRF-TOKEN и X-XSRF-TOKEN в заголовке запроса.
Однако у меня возникает следующая проблема:
- Когда клиент отправляет первый запрос бэкэнду, предварительный запрос проходит, однако фактический запрос не выполняется с кодом состояния 403
- Когда клиент затем отправляет второй запрос, предварительный просмотр и фактический запрос проходят
После некоторой отладки:
- Я заметил, что браузер устанавливает cookie XSRF-TOKEN после первого запроса (я полагаю, после предварительного запроса)
- Фактический запрос(который не выполняется) не содержит заголовок X-XSRF-TOKEN
- Следовательно, имеет смысл, что запрос не выполняется
- Второй запрос содержит правильный заголовок X-XSRF-TOKEN
Поскольку это обычно работает, я не верю, что это проблема бэкэнда. Но я не уверен. Я посмотрел в документации, но не могу найти решение.
Любая помощь очень ценится, спасибо.
Предполетный запрос первого запроса
Фактический первый запрос
Печенье после первого запроса
Предполётный запрос второго запроса
Фактический второй запрос
Печенье после второго запроса ![enter image description here](https://i.stack.imgur.com/WwYBY.png)
Реализация запроса 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("*");
}
}