当前位置: 首页 > 知识库问答 >
问题:

Angular 6不向http请求添加X-XSRF-TOKEN头

许彦
2023-03-14

我已经阅读了文档和所有相关的问题,但是Angular的XSRF机制对我来说仍然不起作用:我无法用自动附加的X-XSRF-TOKEN头发出POST请求。

我有一个角6应用程序与登录表单

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

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

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

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

共有3个答案

郑正文
2023-03-14

稍微偏离了主题,但是对于其他来到这里的人来说,我在后端通过以下方式解决了这个问题(对于sping-start

     /**
     * 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;
    }
金钧
2023-03-14

在我的团队中,问题是我们使用的是绝对路径而不是相对路径。

因此,不要使用以下绝对路径:

this.http.post<any>("https://example.com/api/endpoint",data)

使用

this.http.post<any>("api/endpoint",data)

或者使用

this.http.post<any>("//example.com/api/endpoint",data)

这是因为HttpClientXsrfModule上的角度代码显式忽略绝对路径(请参阅)

许丁雷
2023-03-14

问题再次在于Angular的糟糕文档。

事实是,Angular将添加X-XSRF-TOKEN头,只有当XSRF-TOKENcookie是在服务器端生成的,并且具有以下选项:

  • 路径=/
  • httpOnly=false(这非常重要,而且完全没有文档记录)

此外,Angular应用程序和被调用的URL必须位于同一服务器上。

参考:这个Angular Github问题

 类似资料:
  • 我必须保护我的Web应用程序不受CSRF的影响,这是一个非常复杂的问题。Net核心MVC web应用程序,客户端为Angular 9。 这是我尝试过的 在Angular应用程序中,我添加了一个http拦截器来提取和发送请求头中的令牌 现在我从服务器收到一个错误的请求错误(400)

  • 我正在编写一个mdp文件,并且我正在寻找一种方法来指定(或修改)客户端为特定演示文稿所做的所有请求的HTTP标头。我想在超文本传输协议请求中添加一个授权字段。我希望在不编辑客户端sw的情况下这样做。 我已经阅读了ISO/IEC 23009-1,但我没有发现任何关于它的信息。有人知道怎么做吗?

  • 我已经为CSRF设置了Spring Boot 1.5. x。在Spring上测试一切正常:(1)服务器生成令牌并发送给客户端(2)如果客户端发送令牌一切正常。 对于web客户端,我有Spring Boot作为rest API(http://localhost:8088/)和angularjs作为客户端(http://localhost:9000),但它接缝的问题是在angularjs上,它在头键X

  • 此外,客户机url http://localhost:8081被添加到KeeyCloak中的Web Origins中。不确定还缺少什么来让它工作。

  • 我使用角1.0.4与ASP. NET MVC4 Web API项目。我试图利用角的CSRF保护,但没有用。我可以看到我正在传递一个名为XSRF-TOKEN的cookie,但是当角尝试在响应中添加名为X-XSRF-TOKEN的标头值时,该值显示为未定义。我试着遵循这里的建议,但是超文本标记语言还没有渲染,所以没有找到元素。 我可能会错过什么?是由ASP生成的RequestVerificationTo

  • 问题内容: 我正在与现有的servlet集成,该servlet从HTTP标头中提取一些属性。基本上,我实现的接口无法访问实际请求,它只能访问HTTP标头的k-> v映射。 我需要传递一个请求参数。计划是使用servlet过滤器从参数到标头值,但是HttpServletRequest对象当然没有addHeader()方法。 有任何想法吗? 问题答案: Extend ,覆盖标头吸气剂以返回参数: ..