我已经看到了很多关于如何在 iOS Web 应用程序中永久存储 cookie 的问题和答案……但我似乎连这一套都没有。
该应用程序在真正的桌面浏览器中运行良好,但在 iOS 应用程序中运行时失败。
我有一个应用程序通信的 Rails Web 服务 UI,但所有应用程序逻辑和代码都在使用 Backbone、jQuery 等的客户端上......
表单通过 AJAX POST 向 Web 服务提交用户登录信息:
$.ajax({url: 'http://mydomain.fake/login',
type: 'POST',
data: data,
xhrFields: { withCredentials: true },
success: successFunc,
error: errorFunc});
然后服务器对用户进行身份验证,并且 FOR NOW 发送回带有用户身份的加密永久 cookie:
def login
@account = Account.find_by(email: params[:email]).try(:authenticate, params[:password])
unless @account.nil? || @account == false
cookies.permanent.signed[:user] = @account
return head :ok
end
head :unauthorized
end
使用 safari 连接到应用程序并检查对此调用的响应,我会返回相应的 cookie 标头:
Set-Cookie user=<encrypted string>; path=/; expires=Fri, 29 Sep 2034 01:50:31 -0000
现在检查时document.cookie
那里什么都没有。查看 Safari 左侧的资源,没有 cookie。并且刷新时,与上述相同的症状,并且应用程序不知道用户是谁并将其返回到登录页面......
有谁知道为什么应用程序无法存储 cookie。我没有关闭并重新打开应用程序,因此这不是已知问题(Safari 会在关闭时删除 cookie)或(应用程序是沙盒)或(尚未设置 cookie 的到期时间)。我彻底糊涂了。
更新:
我将 CORS 标头添加到 Web 服务器,虽然它们似乎不需要,但没有实现任何区别。我仍然不知道通常可以正常工作的东西是如何不工作的,并且会喜欢任何可能帮助我重回正轨的帮助/指针/链接/任何东西。我目前被卡住了。
更新:
我从使用 jQuery 切换到使用原生 Obj-C 向服务器发出请求的 phonegap 插件。请求成功,但仍然没有设置 cookie。我确信我在这里做错了什么。
更新:
我现在尝试使用 jQuery cookie 设置服务器发送的加密字符串并以这种方式设置。它有效,但前提是我没有在 cookie 上设置域。
$.cookie('user', data.token, {
expires: new Date(2014,12,31),
domain: 'localhost',
path: '/'});
我确信这是一项 CORS 安全功能,您无法在其中设置除您正在处理的域之外的其他域。但是我的测试服务器在localhost:3000
并且我的测试应用程序正在运行,localhost:63342
所以我将 cookie 域设置为localhost
. 这不会通过我的桌面浏览器测试,所以我从来没有在 iOS 中尝试过,因为我什至无法让它在这里工作。
所以我想修改我的问题我应该如何向网络服务验证我的用户并存储一些东西(如令牌),以便我可以在后续访问中识别用户......
更新:
我的网络服务中确实设置了这些标头。我将 设置为Allow-Origin
我拥有的另一个域,因为我无法列出每个用户的每个来源。除非它应该被设置为localhost
或为他们设置什么?
'Access-Control-Allow-Origin' => '<what should I put here>',
'Access-Control-Request-Method' => '*',
'Access-Control-Allow-Credentials' => 'true',
'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD',
'Access-Control-Allow-Headers' => 'Origin, Accept, Content-Type, Cookie'
无论哪种方式,webview都不会产生CORS 错误,这与实际的 safari 或桌面浏览器不同(即使我根本没有设置它们)。