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

Angular4 http客户端csrf不发送x-xsrf令牌

丌官浩旷
2023-03-14

在angular文档中,提到angularhttpclient将在post请求的头X-XSRF-TOKEN中自动发送cookieXSRF-TOKEN的值。文档链接

但它没有为我发送标题。这是我的密码

Nodejs用于设置cookie的代码

router.get('/set-csrf',function(req,res,next){
    res.setHeader('Set-Cookie', "XSRF-TOKEN=abc;Path=/; HttpOnly; SameSite=Strict");    
    res.send();
  })

我在app.module.ts中使用了http客户端

imports: [
  HttpClientModule
]

**以上代码仅用于调试目的。我没有set-csrf终结点。

但是当我发送帖子请求时,它不会发送任何标题。我不能调试。

我也在angular的github存储库中添加了这个问题。HttpXsrfInterceptor检查请求是GET还是HEAD,或者是否以http开头。如果为true,则跳过添加标题。

以下是HttpXsrfInterceptor类中的代码

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const lcUrl = req.url.toLowerCase();
    // Skip both non-mutating requests and absolute URLs.
    // Non-mutating requests don't require a token, and absolute URLs require special handling
    // anyway as the cookie set
    // on our origin is not the same as the token expected by another origin.
    if (req.method === 'GET' || req.method === 'HEAD' || lcUrl.startsWith('http://') ||
        lcUrl.startsWith('https://')) {
      return next.handle(req);
    }
    const token = this.tokenService.getToken();

    // Be careful not to overwrite an existing header of the same name.
    if (token !== null && !req.headers.has(this.headerName)) {
      req = req.clone({headers: req.headers.set(this.headerName, token)});
    }
    return next.handle(req);
  }

我不知道他们为什么跳过http/s部分。这是我在github的问题

共有3个答案

汪跃
2023-03-14

使用最新的Angular版本,我遇到了以下问题。当使用标头名称'XSRF-TOKEN'将令牌传递给客户端时,响应必须使用标头名称'X-XSRF-TOKEN'反馈令牌。这是米罗斯拉夫代码的一个稍微修改的版本,上面的代码对我有用。

@Injectable()
export class HttpXSRFInterceptor implements HttpInterceptor {

  constructor(private tokenExtractor: HttpXsrfTokenExtractor) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const headerName = 'XSRF-TOKEN';
    const respHeaderName = 'X-XSRF-TOKEN';
    let token = this.tokenExtractor.getToken() as string;
    if (token !== null && !req.headers.has(headerName)) {
      req = req.clone({ headers: req.headers.set(respHeaderName, token) });
    }
    return next.handle(req);
  }
}
锺离明煦
2023-03-14

我想正确的方法是使用选项。我使用了withConfig,但在类型“typeof HttpClientXsrfModule”上不存在属性“withConfig” 这是文档中的键入问题。您需要使用“withOptions”,而不是HttpClientXsrfModule。withOptions({cookieName:'My Xsrf Cookie',headerName:'My Xsrf Header',})

仉成益
2023-03-14

你要找的是HttpClientXsrfMoules

请在此处阅读更多信息:https://angular.io/api/common/http/HttpClientXsrfModule.

您的用法应如下所示:

imports: [   
 HttpClientModule,  
 HttpClientXsrfModule.withOptions({
   cookieName: 'My-Xsrf-Cookie', // this is optional
   headerName: 'My-Xsrf-Header' // this is optional
 }) 
]

此外,如果您的代码通过绝对URL以API为目标,默认的CSRF拦截器将无法开箱即用。相反,你必须实现你自己的拦截器,它不会忽略绝对路线。

@Injectable()
export class HttpXsrfInterceptor implements HttpInterceptor {

  constructor(private tokenExtractor: HttpXsrfTokenExtractor) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const headerName = 'X-XSRF-TOKEN';
    let token = this.tokenExtractor.getToken() as string;
    if (token !== null && !req.headers.has(headerName)) {
      req = req.clone({ headers: req.headers.set(headerName, token) });
    }
    return next.handle(req);
  }
}

最后将其添加到您的提供商:

providers: [
  { provide: HTTP_INTERCEPTORS, useClass: HttpXsrfInterceptor, multi: true }
]
 类似资料:
  • 我在Spring框架中有csrf保护。所以在每个请求中,我都从ajax调用中发送csrf令牌,这是完美的工作。 在ajax

  • 我正在更改后端每个请求的xsrf令牌cookie值。我一次对服务器进行多个http调用,但对于某些请求,“xsrf cookie”值和“x-xsrf-header”值不相同。 我试图通过参数手动添加x-xsrf-标头,但标头值不是最新的。 这是我试过的代码,

  • 我试图发布一个有效载荷到我们的后端系统从我的UWP应用程序。为此,我首先做一个GET来获取CSRF令牌,然后将其添加到POST请求的标题中。虽然发布,我仍然得到403禁止错误。 我正在用“失眠症”REST客户端进行交叉测试,通过执行单独的GET和POST请求,并将从GET获取的CSRF令牌提供给POST头,它工作正常。 我是新来的C#,所以请原谅不好的编码标准。 拿到代币 我收到了带有csrf令牌

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 我有这个代码: 我一直在犯这样的错误: java:不兼容的类型:com。应用句子分类请求。无法将生成器转换为com。应用句子分类请求 我已经使用Maven插件生成了gRPC Java文件。在看了多个例子后,我不确定我的问题是什么。

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