作者:万熊卡拉梦 | 来源:互联网 | 2023-07-24 19:51
我们有一个Angular应用,该应用向另一个域(无头cms api)上的资源发出请求。流程如下:
Spartacus = Angular,OCC = Java后端,Episerver = .Net后端 拨打10号电话看起来像这样:
getExternalCmsAuthCOOKIE(jwt: string): Observable {
const url = `${this.episerverBaseUrl}/externalauth`;
const requestOptiOns= {
headers: new HttpHeaders({
Authorization: 'Bearer ' + jwt
}),withCredentials: true
};
return this.http.post(url,{},requestOptions);
}
在服务器响应中,我们看到了标题
的Set-COOKIE:角色的标记= eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzUxMTE0OTQsInJvbGVzIjpbIkFwaUNvbnN1bWVycyIsIlBhcnRuZXJQb3J0YWxVc2VycyJdLCJ1c2VySWQiOiI4Nzk2MDk0NzkxNjg0In0.Mbvwe5qPIGSvUS-sFzxzPq7PAMed3LJaVeP8hK7eHQI; expires = 2019年11月30日星期六格林尼治标准时间; domain = api.ourepiserver.com; path = /; SameSite = None;安全; httponly
此后,对cms的所有请求都包含COOKIE,并由发送一些cms内容的服务器允许通过。该内容可以包括指向Episerver的标签。这就是我们需要COOKIE的原因,因为我们无法将任何自定义的HTTP标头添加到浏览器通过标签下载的资源中。
此功能适用于除Safari之外的所有浏览器。有一些重复的问题(但没有详细解释),但似乎没有一个好的答案。
MacOS 10.14和iOS 12上的Safari版本具有a bug,它们将错误地将标记为SameSite=None
的COOKIE视为标记为SameSite=Strict
的COOKIE。如果您未使用最新版本,则可能会遇到此问题。
如果您试图从用户在第一方上下文中从未访问过的第三方域中设置COOKIE,则可能也是ITP限制。
我将通过发送不带SameSite=None
属性的COOKIE来测试它,以查看它是否被Safari传递。如果是,则可能是SameSite
兼容性问题。如果没有,则可能是其他原因。
我还假设您的域确实是不同的站点,而不仅仅是不同的来源。例如img.example.com
和api.example.com
仍然是同一站点。 example.com
和service.elsewhere.api
是跨站点的。
如果您达到SameSite
兼容性,则可以通过设置两个版本的COOKIE或使用用户代理嗅探来缓解这种情况。有关https://web.dev/samesite-COOKIE-recipes的更多详细信息。