Cookies Safari未通过HttpClient/XMLHttpRequest存储cookie集

Cookies Safari未通过HttpClient/XMLHttpRequest存储cookie集,cookies,safari,xmlhttprequest,Cookies,Safari,Xmlhttprequest,我们有一个Angular应用程序,它向另一个域上的资源发出请求(无头CMSAPI)。流程如下: Spartacus=Angular,OCC=Java后端,Episerver=.Net后端 呼叫nr 10如下所示: getExternalCmsAuthCookie(jwt: string): Observable<any> { const url = `${this.episerverBaseUrl}/externalauth`; const requestOptions = {

我们有一个Angular应用程序,它向另一个域上的资源发出请求(无头CMSAPI)。流程如下:

Spartacus=Angular,OCC=Java后端,Episerver=.Net后端

呼叫nr 10如下所示:

getExternalCmsAuthCookie(jwt: string): Observable<any> {
const url = `${this.episerverBaseUrl}/externalauth`;
const requestOptions = {
          headers: new HttpHeaders({
            Authorization: 'Bearer ' + jwt
          }),
          withCredentials: true
        };
return this.http.post(url, {}, requestOptions);
getExternalCmsAuthCookie(jwt:string):可观察{
常量url=`${this.episerverBaseUrl}/externalauth`;
常量请求选项={
标题:新的HttpHeaders({
授权:“持票人”+jwt
}),
证书:正确
};
返回this.http.post(url,{},requestOptions);
}

在服务器响应中,我们可以看到标题

设置Cookie:role-token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyjlehaioje1nzuxmte0otqsinjvbgvzijjpbikfwaunvbnn1bwvycyisillbhcnruzjqb3j0ywxvc2vycyjdlcj1c2vyswqioi4nzk2mdk0nzkjg0in0.Mbvwe5qPIGSvUS-sfzxpqpqp7pamed3ljavep8h7ehqi;expires=2019年11月30日星期六10:58:15 GMT;domain=api.ourepserver.com;路径=/;SameSite=无;保护httponly

在这之后,对cms的所有请求都包含cookie,并由发送一些cms内容的服务器通过。此内容可以包括指向epserver的标记。这就是我们需要cookie的原因,因为我们无法向浏览器通过标记下载的资源添加任何自定义http头


这在除Safari之外的所有浏览器中都有效。有一些重复的问题(但没有详细解释),但似乎没有一个好的答案。

MacOS 10.14和iOS 12上的Safari版本会错误地对待标有
SameSite=none
的cookie,就好像它们被标上了
SameSite=Strict
。如果您不使用最新版本,则可能会遇到此问题

如果您试图从用户从未在第一方上下文中访问过的第三方域设置cookie,那么这也可能只是ITP限制

我将通过发送一个不带
SameSite=None
属性的cookie来测试这一点,以查看它是否被Safari传递。如果是,那么这可能是一个
SameSite
兼容性问题。如果不是这样,很可能是其他原因

我还假设你的域名是真正不同的网站,而不仅仅是不同的来源。e、 g.
img.example.com
api.example.com
仍然是同一个站点
example.com
service.where.api
是跨站点的

如果您正在点击
SameSite
兼容性,您可以通过设置两个版本的cookie或使用useragent嗅探来缓解这一问题。更多详细信息