Angular 6 不会将 X-XSRF-TOKEN header 添加到 http 请求

标签 angular typescript angular6 csrf x-xsrf-token

我读过 the docs以及关于 SO 的所有相关问题,但 Angular 的 XSRF 机制仍然对我不起作用:我绝不能发出自动附加 X-XSRF-TOKEN header 的 POST 请求。

我有一个带有登录表单的 Angular 6 应用程序。

它是 Symfony (PHP 7.1) 网站的一部分,当从 Symfony 提供服务时,Angular 应用页面会发送正确的 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 {
}

然后,在服务的方法中,我发出以下 http 请求(this.httpHttpClient 的一个实例):

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

post 请求从不发送 X-XSRF-TOKEN header 。为什么?

最佳答案

问题又是 Angular 糟糕的文档。

事实是,Angular 将添加 X-XSRF-TOKEN header 仅当 XSRF-TOKEN cookie 是在服务器端生成的具有以下选项:

  • 路径=/
  • httpOnly = false(这很重要,而且完全未记录)

此外,Angular 应用程序和被调用的 URL 必须驻留在同一台服务器上。

引用this Angular Github issue

关于Angular 6 不会将 X-XSRF-TOKEN header 添加到 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50510998/

相关文章:

javascript - Angular2 无效的语言标记 : en_US

javascript - typescript 提示显式类型没有索引签名

typescript - 为什么在 typescript 中覆盖抽象方法参数类型是任意的?

typescript - 为什么 TypeScript 在实现泛型接口(interface)时无法推断出函数参数的类型?

Angular 2 - 未捕获( promise ): TypeError: Cannot read property 'title' of undefined

Angular 4动态填充查询参数

javascript - 如何使用最接近的和 parent 的javascript方法来获取 Angular 6中的td值

testing - 如何使用 Angular 6 和 Apollo 客户端对 GraphQl 进行测试

javascript - 单击按钮以升序/降序对 Angular 中的数据进行排序

javascript - 如何在 Angular 2 中单击表格中的图标时显示其他行?