Я пытаюсь настроить CSFR для моего остального сервера, однако я получаю ошибку 401 для запросов.
Конфигурация безопасности Spring:
private static final String[] CSRF_IGNORE = {"/api/users/login/**"};
@Autowired
CsrfTokenResponseHeaderBindingFilter csrfTokenResponseHeaderBindingFilter;
- метод настройки
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()
.csrf().ignoringAntMatchers(CSRF_IGNORE)
.and()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.headers().frameOptions().sameOrigin()
.and()
.authorizeRequests()
.antMatchers("/",
"/favicon.ico",
"/**/*.png",
"/**/*.gif",
"/**/*.svg",
"/**/*.jpg",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/static/**",
"/static/css/*",
"/static/js/*",
"/*.js",
"/*.json",
"/*.ico"
).permitAll()
.antMatchers(SIGN_UP_URLS).permitAll()
.antMatchers(H2_URL).permitAll()
.anyRequest().authenticated()
;
http.addFilterAfter(csrfTokenResponseHeaderBindingFilter, CsrfFilter.class);
http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
CsrfTokenResponseHeaderBindingFilter
@Component
public class CsrfTokenResponseHeaderBindingFilter extends OncePerRequestFilter {
protected static final String REQUEST_ATTRIBUTE_NAME = "_csrf";
protected static final String RESPONSE_HEADER_NAME = "X-CSRF-HEADER";
protected static final String RESPONSE_PARAM_NAME = "X-CSRF-PARAM";
protected static final String RESPONSE_TOKEN_NAME = "X-CSRF-TOKEN";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, javax.servlet.FilterChain filterChain) throws ServletException, IOException {
CsrfToken token = (CsrfToken) request.getAttribute(REQUEST_ATTRIBUTE_NAME);
if (token != null) {
//X-CSRF-TOKEN
response.setHeader(RESPONSE_HEADER_NAME, token.getHeaderName());
//_csrf
response.setHeader(RESPONSE_PARAM_NAME, token.getParameterName());
response.setHeader(RESPONSE_TOKEN_NAME , token.getToken());
}
filterChain.doFilter(request, response);
}
}
REACT_configuration:
1) токен чтения:
axios.interceptors.response.use(function(response){
const token = response.headers['x-csrf-token'];
localStorage.setItem("csfrToken", token);
return response;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
2) установить токен на запрос:
axios.interceptors.request.use(function (config) {
const csfrToken = localStorage.csfrToken;
axios.defaults.headers.common["X-CSRF-TOKEN"] = csfrToken;
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
В результате этого кода у меня 401 Несанкционированная ошибка. Без CSFR работает хорошо. В ответ у меня есть значение токена csfr, в заголовке запроса у меня есть значение токена: (X-CSRF-TOKEN: "a6b71bfb-d605-4dcc-8e48-35dd755b589f",
например)