Угловой 6 не добавляет заголовок X-XSRF-TOKEN к HTTP-запросу
Я прочитал документы и все связанные с этим вопросы по SO, но механизм Angular XSRF все еще не работает для меня: никоим образом я не могу сделать запрос POST с добавленным заголовком X-XSRF-TOKEN автоматически.
У меня есть приложение Angular 6 с формой входа.
Он является частью веб-сайта Symfony (PHP 7.1), и страница приложения Angular, когда она обслуживается Symfony, отправляет правильный файл cookie (XSRF-TOKEN
):
Мой 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;
}
Ответ 3
Убедитесь, что ваш сервер разрешает заголовки X-CSRF-Token
когда браузер запрашивает метод OPTIONS
.
Пример:
Access-Control-Allow-Headers: X-CSRF-Token, Content-Type
Ссылка: MDN Docs