0

我已经看到了很多关于如何在 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 或桌面浏览器不同(即使我根本没有设置它们)。

4

2 回答 2

0

这里有两种可能:

  1. 由于 cookie 是跨域的,您需要在浏览器设置中将“阻止第三方 cookie”设置为“否”。
  2. 当您在标头中获取适当的 cookie 时,它​​可能会应用于您请求的域。您可以在此问题中使用 Cooper Maruyama 的代码,使 cookie 可用于您的域。
于 2014-10-02T05:53:42.433 回答
0

您无法通过 phonegap 可靠地使用 cookie。真的不值得朝那个方向推进...与phonegap的特殊性有关,它是一个应用程序而不是一个应用程序,如果它真的是一个应用程序,为什么它会使用cookie,因为它不再是一个真正的网页,它是一个神奇的webview我离题了...

你没有做错什么,它的phonegap。它不会保存 cookie。

我假设您正在使用 phonegap,因为您说您在其中一个更新中使用了 phonegap 插件。

而是使用本地存储或会话存储。在我们的应用程序中,我们使用本地存储和 XSRF-TOKEN 的组合,我们保存在那里以检查我们的请求

window.localStorage.setItem("key", "value");

window.localStorage.getItem("key")

window.localStorage.removeItem("key")

和会话存储,当应用关闭时会消失

window.sessionStorage.setItem("key", "value");

window.sessionStorage.getItem("key")

window.sessionStorage.removeItem("key")
于 2014-10-03T07:57:44.150 回答