Angular SSG: Incompatibility between withXsrfConfiguration( ) (HttpClient) & Relative Paths in SSG

tyky79it  于 10个月前  发布在  Angular
关注(0)|答案(5)|浏览(121)

哪个@angular/*包是bug的来源?

common

这是回归吗?

是的

描述

  • 我的后端API位于 api.domain.com
  • 我在Angular应用中使用路径 //api.domain.com/api/product 获取数据。这种方法是必要的,因为 withXsrfConfiguration() 在绝对路径(例如,https://api.domain.com/api/product)上无法正常工作。
  • 虽然在运行时,这种相对路径(//api.domain.com/api/product)可以正常工作,但在SSG构建时间时无法正确解析。这导致了产品预渲染页面上没有数据。
  • 有趣的是,绝对路径在SSG期间可以正常工作,但它们阻止了withXsrfConfiguration的使用,这是跨站点请求伪造(CSRF)保护的关键。
  • 是否有已知的解决方法来解决Angular 17中withXsrfConfiguration和SSG中的相对路径之间的不兼容性。
  • 此外,如果我们使用代理并有一个类似于/api/product的相对URL,那么在使用withXsrfConfiguration时可能会起作用,但在SSG中不起作用。

结论

  • // (protocol-relative) and / (root-relative)这样的相对URL在使用withXsrfConfiguration时可以正常工作,但在SSG中不行;而绝对URL在SSG中可以正常工作,但不能与withXsrfConfiguration一起使用。

请提供一个链接,以便最小化地重现bug

  • 无响应*

请提供您看到的异常或错误

  • 无响应*

请提供您在以下环境中发现此bug的环境(运行ng version)

  1. Angular CLI: 17.3.2
  2. Node: 21.7.1 (Unsupported)
  3. Package Manager: npm 10.5.2
  4. OS: win32 x64
  5. Angular: 17.3.1
  6. ... animations, cdk, common, compiler, compiler-cli, core, forms
  7. ... material, platform-browser, platform-browser-dynamic
  8. ... platform-server, router
  9. Package Version
  10. ---------------------------------------------------------
  11. @angular-devkit/architect 0.1703.2
  12. @angular-devkit/build-angular 17.3.2
  13. @angular-devkit/core 17.3.2
  14. @angular-devkit/schematics 17.3.2
  15. @angular/cli 17.3.2
  16. @angular/ssr 17.3.2
  17. @schematics/angular 17.3.2
  18. rxjs 7.8.1
  19. typescript 5.2.2
  20. zone.js 0.14.3

还有其他需要说明的吗?

  • 无响应*
sqxo8psd

sqxo8psd1#

你好,@surajchopra1234,你在使用withFetch吗?你在使用哪些Angular CLI构建器?

pbossiut

pbossiut2#

你好@alan-agius4
我正在使用withFetch和新的Angular应用程序构建器。

kr98yfug

kr98yfug3#

看起来XSRF对于带有协议的URL不起作用,这是因为框架中的实现。请查看:
angular/packages/common/http/src/xsrf.ts
第100行到第101行:
| | lcUrl.startsWith('http://')|| |
| | lcUrl.startsWith('https://') |
这个限制是由于在不同来源设置的cookie之间存在差异。然而,它无法处理cookie在子域名之间共享的情况。你能确认你的场景中是否是这种类型的cookie吗?
无协议的URL完全由浏览器管理,因此与Node.js等环境不兼容。浏览器根据当前页面确定协议,使得该功能在服务器上无法使用。此外,由于各种缺点,无协议URL的使用变得越来越少:

  1. 安全漏洞:无协议URL存在“中间人”攻击的风险,尤其是在HTTP服务的站点上。
  2. 性能影响:浏览器在确定正确的协议时可能会遇到资源加载延迟。
  3. 混合内容担忧:将通过HTTP加载的无协议URL集成到安全的HTTPS页面中,可以在浏览器中触发混合内容警告。
    在服务器端进行SSG/SSR时,XSRF令牌目前正在被noop掉。请查看:
    angular/packages/common/http/src/xsrf.ts
    第74行到第76行:
    | | if(this.platform==='server'){ |
    | | returnnull; |
    | | } |
    虽然可以调整SSR的行为来调整此行为,但在SSG的情况下,令牌将保持未定义。这是因为在SSG期间没有请求,阻止了从文档或请求中检索cookie。
    这需要框架支持一种不同的方法,可以通过环境变量设置令牌的值,例如示例 XSRF_TOKEN="blabla" ng build 或者作为DI令牌在应用程序中设置。
展开查看全部
4szc88ey

4szc88ey4#

你好@alan-agius4,
感谢你解决这个问题。

后端:位于 api.domain.com
Angular应用:运行在 www.domain.com
XSRF Cookie:域设置为 .domain.com ,使其可以从 api.domain.comwww.domain.com 访问

问题:

  • 使用相对路径会导致SSG中断,但相对路径对于XSRF是必需的

建议解决方案:

  • 使XSRF与绝对路径一起工作 (例如 https://api.domain.com/api/user) 将解决所有问题,并允许我们在SSR、SSG和客户端浏览器之间拥有一致的URL。
展开查看全部
az31mfrm

az31mfrm5#

解决方法:
在SSG/SSR中使用绝对路径进行GET请求,但CSRF保护不需要对GET请求进行此操作(无需令牌)。理想情况下,我们应该使用其他HTTP方法(如POST等)的相对路径来启用CSRF保护。这些操作不需要SSG,因为它们涉及动态数据。

这种解决方法使得URL在不同情况下不一致,可能会导致问题并且难以理解。

相关问题