Почему при загрузке Spring + Angular 7 появляется ошибка 403 «CSRF-токен отсутствует»? - PullRequest
0 голосов
/ 30 апреля 2019

Я внедряю csrf в Spring Boot + Angular 7 Application, меня беспокоит, когда я делаю вход в систему, тогда я могу войти в приложение без каких-либо проблем.Но после того как логин csrf cookie не меняется, я получаю от сервера ошибку 403 (CSRF expired),

Но когда я обновляюсь, он будет работать правильно.Основная причина заключается в том, что cookie не загружается должным образом, я не знаю, где возникает проблема, например, на стороне клиента или на стороне сервера.Пожалуйста, помогите

Я поделился своим кодом

Spring Boot Code

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.httpBasic().and().csrf() // csrf config starts here
        .csrfTokenRepository(csrfTokenRepository())
        .ignoringAntMatchers("/", "/login", "/captcha-servlet", "/validateOTP", "supportApp/logout")
        .and()
        .addFilterAfter(new CustomCsrfFilter(), CsrfFilter.class);
}


private CsrfTokenRepository csrfTokenRepository() {
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
    repository.setHeaderName("X-XSRF-TOKEN");
    return repository;
}

CSRF Filter

public class CustomCsrfFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
        if (csrf != null) {
            Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
            String token = csrf.getToken();
            cookie = new Cookie("XSRF-TOKEN", token);
            cookie.setPath("/");
            response.addCookie(cookie);
        }
        filterChain.doFilter(request, response);
    }
}

Угловой код CSRF

<code>import { HttpClient, HttpXsrfTokenExtractor, HttpHeaders } from '@angular/common/http';

<code>constructor(private http: HttpClient, private tokenExtractor: HttpXsrfTokenExtractor) { }

<code>const _csrf_token = this.tokenExtractor.getToken() as string;
return this.http.post(this._singleuserUrl, uid, {headers: new HttpHeaders().set('X-XSRF-TOKEN', _csrf_token), withCredentials: true});
...