我在 MobileSafari 中加载了一个页面,该页面通过 CORS 与另一台服务器通信。
在桌面浏览器(经过测试的 Chrome 和 Safari)中,我能够登录,获取会话 cookie,并将该会话 cookie 发送回以供后续请求,以便我可以通过所有 API 调用进行身份验证。
但是,当我通过 Mobile Safari 登录时,cookie 不会在后续请求中返回。
我正在使用 Charles Proxy 监视正在发生的事情,它告诉我:
POST https://myremoteserver.com/sessions.json
传递我的登录信息- 它成功并收到带有有效
Set-Cookie
标头的响应。 GET https://myremoteserver.com/checkout.json
被请求,没有Cookie
请求头。- 服务器响应好像我没有登录一样。
我使用这个片段Zepto.js
来确保withCredentials: true
在 XHR 对象上正确设置。(请原谅咖啡脚本)
# 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 中是否有一些怪癖会阻止它像桌面浏览器一样工作?为什么它不能以同样的方式工作?
编辑!
这是我在 Rails 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 一样。我不完全确定我昨天的评估是否不准确,或者 Apple 只是在欺骗我……
https://
在远程 url 上使用也会受到影响吗?