哪个@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
)
Angular CLI: 17.3.2
Node: 21.7.1 (Unsupported)
Package Manager: npm 10.5.2
OS: win32 x64
Angular: 17.3.1
... animations, cdk, common, compiler, compiler-cli, core, forms
... material, platform-browser, platform-browser-dynamic
... platform-server, router
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1703.2
@angular-devkit/build-angular 17.3.2
@angular-devkit/core 17.3.2
@angular-devkit/schematics 17.3.2
@angular/cli 17.3.2
@angular/ssr 17.3.2
@schematics/angular 17.3.2
rxjs 7.8.1
typescript 5.2.2
zone.js 0.14.3
还有其他需要说明的吗?
- 无响应*
5条答案
按热度按时间sqxo8psd1#
你好,@surajchopra1234,你在使用
withFetch
吗?你在使用哪些Angular CLI构建器?pbossiut2#
你好@alan-agius4
我正在使用
withFetch
和新的Angular应用程序构建器。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的使用变得越来越少:
在服务器端进行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令牌在应用程序中设置。4szc88ey4#
你好@alan-agius4,
感谢你解决这个问题。
后端:位于
api.domain.com
Angular应用:运行在
www.domain.com
XSRF Cookie:域设置为
.domain.com
,使其可以从api.domain.com
和www.domain.com
访问问题:
建议解决方案:
https://api.domain.com/api/user
) 将解决所有问题,并允许我们在SSR、SSG和客户端浏览器之间拥有一致的URL。az31mfrm5#
解决方法:
在SSG/SSR中使用绝对路径进行GET请求,但CSRF保护不需要对GET请求进行此操作(无需令牌)。理想情况下,我们应该使用其他HTTP方法(如POST等)的相对路径来启用CSRF保护。这些操作不需要SSG,因为它们涉及动态数据。
这种解决方法使得URL在不同情况下不一致,可能会导致问题并且难以理解。