MobileSafari不会发回由CORS设置的Cookie
我在MobileSafari中加载了一个页面,通过CORS与另一台服务器进行通信。
在桌面浏览器(经过testing的Chrome和Safari)中,我可以login,获取会话cookie,并将该会话cookie发回给后续请求,以便我可以通过所有API调用进行身份validation。
但是,当我通过Mobile Safarilogin时,Cookie不会在后续请求中发回。
我使用Charles Proxy来监视发生了什么,它告诉我:
-
POST https://myremoteserver.com/sessions.json
传递我的login信息 - 它成功,并收到一个有效的
Set-Cookie
头的响应。 - 请求
GET https://myremoteserver.com/checkout.json
,没有Cookie
请求头。 - 服务器响应,如果我没有login。
我在Zepto.js
使用这段代码来确保在XHR对象上正确设置withCredentials: true
。 (赦免咖啡)
# Add withCredentials:true to the xhr object to send the remote server our cookies. xhrFactory = $.ajaxSettings.xhr $.ajaxSettings.xhr = -> xhr = xhrFactory.apply(this, arguments) xhr.withCredentials = yes xhr
这个片段在桌面浏览器中效果很好,在我添加之前,我无法在这些桌面浏览器中保留会话cookie。
MobileSafari中是否存在一些令桌面浏览器无法正常工作的问题? 为什么它不以同样的方式工作?
编辑!
这是我的轨道2.3应用程序,我相信相当标准的东西我的CORS头设置
def add_cors_headers if valid_cors_domain headers['Access-Control-Allow-Origin'] = request.headers['HTTP_ORIGIN'] headers['Access-Control-Expose-Headers'] = 'ETag' headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD' headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,If-Modified-Since,If-None-Match' headers['Access-Control-Allow-Credentials'] = 'true' headers['Access-Control-Max-Age'] = '86400' end end
今天,Mountain Lion的桌面Safari也开始不发送cookie,就像MobileSafari一样。 我不完全确定,如果我昨天的评估是不准确的,或者苹果只是在拖我。
也可以通过使用https://
在远程URL影响?
我不知道这个解决scheme是可行的还是可以接受的,但是我也遇到了与移动Safari和JSONP应用相同的问题。 似乎Safari并不接受第三方cookies。 我去设置> Safari浏览器>接受cookies和设置“始终”,问题蒸发。 祝你好运。
我可以在来自jsonp请求的响应中设置cookie吗?
您没有提到远程服务器是在不同的域还是只是一个不同的子域。 我假设是在不同的领域。
正如@schellsan指出的那样,即使CORS策略允许cookies访问第三方cookie,您也不能将Cookie设置/写入其他域。 这是最新的Safari浏览器限制。 我想Firefox即将做同样的事情。
我目前正在评估的变通办法:
- 在远程服务器上使用redirect,以便在redirect客户端时(远程URL位于浏览器栏中),您可以设置Cookie
- 使用自定义标题
我遇到了同样的问题。
我的设置是:
- 在域a.com的服务器A上的AngularJS(Ionic)应用程序
- 带有Passport JS的NodeJS作为服务器B上的后端,具有域b.com
除了iOS上的Mobile Safari之外,每个浏览器都使用cookie进行login。 另外,iOS中的移动cookie(不要跟踪)设置的变化对这个问题没有任何影响。
解决scheme是设置一个CNAME DNSlogging
backend.a.com CNAME b.com
打开一个通过iFrame设置cookie的地址 – 这将设置cookie。