У меня есть внутреннее приложение Spring Boot, которое работает на порту 8888, и внешнее приложение Angular, которое работает на 4200.
В своем приложении Spring Boot я определил следующий компонент для обработки CORS:
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
};
}
И моя HttpSecurity
конфигурация выглядит так:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().disable()
// ... the rest of the config
}
При такой конфигурации все работает нормально, я могу успешно вызывать мой API из приложения Angular.
Но я бы хотел включить CSRF, поэтому я изменил конфигурацию безопасности на следующую:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
// ... the rest of the config
}
И я добавил следующее HttpInterceptor
в мое приложение Angular:
constructor(private tokenExtractor: HttpXsrfTokenExtractor) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = this.tokenExtractor.getToken();
if (token) {
req = req.clone({ setHeaders: { 'X-XSRF-TOKEN': token } });
}
return next.handle(req);
}
Проблема в том, что tokenExtractor.getToken()
всегда возвращает null
.
Соответствующие заголовки запроса и ответа выглядят так:
Присутствует XSRF-TOKEN
ответный файл cookie.
Я не могу понять, в чем проблема.
Я пытался импортировать HttpClientXsrfModule
в мое приложение Angular, но это не имеет значения.
Буду очень признателен за любой совет.