angular4 httpclient csrf不发送x-xsrf-token

2024-02-11

在 Angular 文档中,提到了 Angularhttpclient会自动发送cookie的值XSRF-TOKEN在标题中X-XSRF-TOKEN的帖子请求。文档链接 https://angular.io/guide/http#security-xsrf-protection

但它不会为我发送标头。这是我的代码

设置cookie的Nodejs代码

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

我在 app.module.ts 中使用了 httpclient

imports: [
  HttpClientModule
]

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

但当我发送 post 请求时它不会发送任何标头。我无法调试。

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

这是代码HttpXsrfInterceptor 类 https://github.com/angular/angular/blob/54e02449549448ebab6f255f2da0b4396665c6f0/packages/common/http/src/xsrf.ts#L76

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 中的问题 https://github.com/angular/angular/issues/18859


您正在寻找的是HttpClientXsrfModule.

请在这里阅读更多相关信息:https://angular.io/api/common/http/HttpClientXsrfModule 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 }
]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

angular4 httpclient csrf不发送x-xsrf-token 的相关文章

随机推荐

  • 如何在 Jersey/Spring 中使用 @QueryParam 重载方法?

    我想使用 QueryParam 重载一个方法 但每次我尝试执行此代码时 它都会抛出 SEVERE Exception occurred when intialization com sun jersey spi inject Errors
  • Matplotlib,绘图上的对数色标,但颜色条图例上的线性色标

    我想以对数比例绘制 我已经使用以下方法完成了 plt contourf cube 0 data levels np arange 0 6000 10 norm mplc LogNorm 但我希望颜色条仍然是线性比例 这可能吗 如果可以的话我
  • Server.MapPath 并从 ASP.NET 应用程序运行命令行实用程序

    我需要使用 ASP NET 应用程序运行可执行文件Process exe 文件位于 ASP NET 项目内 ProjectRoot Utilities utility exe 为什么这段代码运行失败 string path Server M
  • 使用路径相关类型作为类参数

    我想要一个类 它采用依赖于类的类型的参数 就像我经常对方法所做的那样 然而 令我惊讶的是 这不起作用 scala gt trait Compiler trait Config defined trait Compiler works fin
  • 如何使用 JWT 令牌管理多设备同时登录?

    我的疑问是关于使用 JWT 令牌支持同一用户同时进行多设备登录 我使用 NestJS 作为我的后端 用户表 userid 用户名 密码 包含哈希密码 名称 refreshToken 包含哈希刷新令牌 当用户执行 api login 调用时
  • HOC 上的组件定义缺少显示名称

    我正在尝试创建一个更高阶的组件 但不断收到此 eslint 警告 组件定义缺少显示名称 我尝试添加如下所示的显示名称 但它仍然抱怨 import React from react const HOC props gt WC gt WC di
  • 以编程方式更改 Android 中矢量的 fillColor

    我想以编程方式编辑 Android 中矢量文件的填充颜色 在 xml 文件中 我可以使用属性设置颜色机器人 填充颜色但我想在运行时改变颜色 有什么例子吗 谢谢 This https medium com emmaguy dynamicall
  • 尝试使用 imagecreatefromstring 保存 base64 图像,但它是全黑的

    我正在尝试从数据库中获取 Base64 编码图像并将其保存到文件中 无论出于何种原因 当我尝试使用 imagecreatefromstring 和 imagepng 时 图像完全是黑色的 我尝试了很多不同的方法 但最终还是得到了一个黑匣子
  • msbuild复制文件

    我在使用 MSbuild 复制文件时遇到问题 并且收到的错误消息似乎相互矛盾 使用 TFS 2008 进行构建 我目前的构建脚本中有以下内容
  • EL 表达式:传递 null 作为 BigDecimal 字段的值

    我有课BigDecimal财产 当我绑定到它 EL 表达式并传递 null 时 valueExpression set context null 财产的新价值变为BigDecimal ZERO 有什么方法可以将 null 传递给BigDec
  • 如何在 C# 中将视频转换为字节数组?

    我正在使用 c net 紧凑框架 3 5 我想将视频文件转换为字节数组 以便我可以将其上传到服务器上 以类似的方式 我正在进行图像上传 获得了成功的结果 HttpWebRequest request request ContentType
  • RGB 到 HSL 转换

    我正在创建一个颜色选择器工具 对于 HSL 滑块 我需要能够将 RGB 转换为 HSL 当我搜索 SO 进行转换的方法时 我发现了这个问题HSL 到 RGB 颜色转换 https stackoverflow com questions 23
  • 为什么 [][[]] 的计算结果为未定义?

    表达方式 评估为undefined在 JavaScript 中 我对此的理解是编译器看到第二组 并将其解释为数组下标运算符 因为不能让两个数组彼此相邻 所以编译器知道内部表达式 必须是一个索引 因此在评估它之后 它会将其强制为一个数字 Nu
  • 查询以查明外键是否在数据库中的其他位置被引用

    我有餐桌动物 我想返回该表中的所有内容 一列 该列表示记录是否在其他任何地方作为外键引用 I E Animal Id Name 1 Cat 2 Dog 3 Parrot 我想返回这个 AnimalId Name Referenced 1 C
  • 我可以使用Web App的私钥证书来签署JWT吗?

    我正在为 Chrome 浏览器开发推送通知服务器 在 Google Cloud Console 上 我已将我的应用程序注册为 Web 应用程序并下载了私钥证书 我可以使用此证书来签署 JWT 请求吗 可以 但出于多种目的共享私钥通常不是一个
  • 无法在 AWS Lambda 上加载文件 mysql2

    尝试让 Lambda 连接到 RDS 数据库 但无法加载 mysql2 gem 尝试过pristine说明 但这并没有解决问题 我已经在供应商目录中构建了 mysql2 gem 这是使用捆绑安装 部署 据推测 这是一个问题 因为 mysql
  • CodeIgniter:在实时服务器上找不到 404 页面

    我一直在使用 CodeIgniter 开发一个小型 Web 应用程序 在本地进行测试后 我将其放在我的网络服务器上 以允许其他人测试一些功能 导航到该网站时 我得到 404页面未找到错误页面 当在我的本地计算机上查看它时 一切都会加载并完美
  • 如何在 Google App Engine 上调试 Cron 作业?

    情况 Cron 与 Rails 应用程序一起 部署到 GCPcron yaml cron description count things regularly url api v1 cron rake task schedule every
  • AWS Cloudfront 和 ELB 安全组

    有谁知道如何将您的cloudfront发行版添加到ELB的安全组入站规则中 我们为一个新站点设置了一个云前端发行版 该站点具有一组列入白名单的安全组规则 我看不到如何配置安全组以允许来自 cloudfront 发行版的请求 有任何想法吗 如
  • angular4 httpclient csrf不发送x-xsrf-token

    在 Angular 文档中 提到了 Angularhttpclient会自动发送cookie的值XSRF TOKEN在标题中X XSRF TOKEN的帖子请求 文档链接 https angular io guide http securit