Угловой 6 не добавляет заголовок X-XSRF-TOKEN к HTTP-запросу

Я прочитал документы и все связанные с этим вопросы по SO, но механизм Angular XSRF все еще не работает для меня: никоим образом я не могу сделать запрос POST с добавленным заголовком X-XSRF-TOKEN автоматически.

У меня есть приложение Angular 6 с формой входа.

Он является частью веб-сайта Symfony (PHP 7.1), и страница приложения Angular, когда она обслуживается Symfony, отправляет правильный файл cookie (XSRF-TOKEN):

enter image description here

Мой app.module.ts содержит нужные модули:

// other imports...
import {HttpClientModule, HttpClientXsrfModule} from "@angular/common/http";

// ...
@NgModule({
  declarations: [
    // ...
  ],
  imports: [
    NgbModule.forRoot(),
    BrowserModule,
    // ...
    HttpClientModule,
    HttpClientXsrfModule.withOptions({
      cookieName: 'XSRF-TOKEN',
      headerName: 'X-CSRF-TOKEN'
    }),
    // other imports
  ],
  providers: [],
  entryComponents: [WarningDialog],
  bootstrap: [AppComponent]
})
export class AppModule {
}

Затем внутри метода Service я выполняю следующий http-запрос (this.http является экземпляром HttpClient):

this.http
    .post<any>('api/login', {'_username': username, '_pass': password})
    .subscribe(/* handler here */);

Почтовый запрос никогда не отправляет заголовок X-XSRF-TOKEN. Почему?

Ответы

Ответ 1

Проблема еще раз - документация с угловым белым.

Дело в том, что Angular добавит заголовок X-XSRF-TOKEN только если файл cookie XSRF-TOKEN был создан на стороне сервера со следующими параметрами:

  • Путь = /
  • httpOnly = false (это очень важно и полностью недокументировано)

Кроме того, приложение Angular и вызываемый URL должны находиться на одном сервере.

Ссылка: этот вопрос с угловым Гитубом

Ответ 2

Немного не по теме, но для тех, кто сюда заходит, я решил эту проблему в бэк-энде следующим образом (для spring-boot)

     /**
     * CORS config - used by cors() in configure() DO NOT CHANGE the METDHO NAME
     * 
     * @return
     */
    @Bean()
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Lists.newArrayList("http://localhost:4200"));
        configuration.setAllowedMethods(Lists.newArrayList("GET", "POST", "OPTIONS"));
        configuration.setAllowCredentials(true);
        configuration.setAllowedHeaders(Lists.newArrayList("x-xsrf-token", "XSRF-TOKEN"));
        configuration.setMaxAge(10l);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }