JavaScript在iPhone的Chrome和Firefox中fetch时无法设置Cookie

4
我正在为一项大学项目研究此行为。我在Google Cloud上部署了一个React Web应用程序和一个Go服务器。Web应用程序使用由我的Go服务器提供的API。该应用程序在台式机环境和Android智能手机上使用Chrome和Firefox浏览器运行得非常好,但当我在iOS(iPhone8)上使用相同的浏览器时,API调用不包含我在Go服务器中需要用于用户身份验证的cookie。Safari也可以正常工作,所以我只在iPhone上的Chrome和Firefox看到这种行为。这是两个调用相同API的标头,第一个使用Safari进行,第二个使用Firefox进行:Safari(iOS 12.0.1)。
GET /example/users HTTP/1.1
Host: api-server.com
Connection: close
Accept-Language: en-gb
Cookie: default=MTU0MDM3MTA0... /*COOKIE IS SET HERE*/
Dnt: 1
Origin: https://example.com
Referer: https://example.com/
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) 
            AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 
            Mobile/15E148 Safari/604.1
X-Cloud-Trace-Context: 38640...

火狐浏览器(v14.0)

GET /example/users HTTP/1.1
Host: api-server.com
Connection: close
Accept-Language: en-gb
Origin: https://example.com
Referer: https://example.com/
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) 
            AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/14.0b12646 
            Mobile/16A404 Safari/605.1.15
X-Cloud-Trace-Context: cb5ff...

当我使用fetch发送请求时,我设置了选项credentials: 'include',但是你可以看到第二个调用没有设置我所需的cookie... 我错过了什么吗?谢谢你的帮助。
1个回答

2
我认为您可能遇到了这个问题
关键点如下:

Safari附带了保守的cookie策略,仅允许cookie写入用户选择(“导航到”)的页面。这种默认保守策略可能会使尝试编写cookie并失败的基于框架的站点感到困惑。

一个稍微复杂的解决方法是使用iframe来加载设置cookie的页面,而不是使用JavaScript。 在此处阅读更多信息
根据您要实现的目标,也许您根本不需要cookie。例如,当我遇到同样的问题时,我最终使用Fingerprintjs2代替 - 但我只想使用cookie进行遥测;指纹识别肯定不适用于cookie可以覆盖的每种用例。

1
但是Safari可以工作,它设置了cookie。Firefox和Chrome不行! - Ve9
1
你应该知道,为iPhone编写的第三方浏览器实质上使用了Safari Mobile的“可嵌入”版本的渲染引擎。也就是说,如果你在iPhone上启动Chrome/Firefox/Edge,它们本质上仍然是Safari Mobile,只是具有不同的用户界面,并且可能比Safari Mobile(第一方应用程序)本身更受限制地访问系统。因此,如果你只在iPhone上(这是我从你最初的问题中理解到的)在第三方浏览器中遇到问题,那么我建议的链接仍然值得检查 :) - Dániel Kis-Nagy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接