【问题标题】:Safari extension cookies not recognized/passedSafari 扩展 cookie 无法识别/通过
【发布时间】:2011-10-12 13:51:32
【问题描述】:

我最近将 Chrome 扩展移植到 Safari,遇到了这种错误(错误、功能等)

因此,在全局页面中,我有一个对安全页面的 XMLHTTP 请求,该安全页面只有在您登录后才可用。

例子:

  1. 我只是使用浏览器登录 - 就像您通常在 facebook 或其他安全页面上所做的那样
  2. 之后,在全局页面中,我加载了一个仅登录可用的 xmlhttp - 它说我没有登录

似乎全局页面有些自己的 cookie,所以安全页面认为我是新的

ps:在 Chrome 中我可以加载该页面,它认为我代表登录用户行事,所以我猜 Safari 中存在一些限制

pps:我听说 Safari 中有一个阻止第三方 cookie 选项,但即使我将其选中“从不阻止”它仍然不起作用

【问题讨论】:

  • 是的,我遇到了同样的问题,并注意到它在几秒钟后反映。你能解决这个问题吗?
  • 不,在 Mac 支持中提交了一个官方错误...但我仍然不知道它是否已修复。对于我正在做的这个项目,我不得不拒绝支持 Safari :(
  • 好的,可以分享一下mac支持链接吗?
  • cookie 是由什么设置的?如果是 PHP,则可能是 cookie 被安全设置和/或仅作为 HTTP(参见php.net/setcookie),因此不会由 JavaScript/AJAX 发回。
  • @David,这是一个扩展程序,如果您阅读了我的问题,您应该注意到 Chrome 可以正常工作

标签: javascript cookies safari xmlhttprequest safari-extension


【解决方案1】:

不幸的是,safari 5.1.7 windows 版本仍然存在该问题。

我找到了一种解决方法,可以使用消息传递将登录凭据(用户名/密码对)传递到全局页面,全局页面使用它们进行静默登录。

【讨论】:

  • 全局页面...现在这很有趣,所以您将所有工作传递给全局页面并等待响应异步方式?
  • @John,你能用代码示例详细说明一下这个过程吗?有趣的是,当某些 SO 帖子需要发布代码示例时,您的回答被认为是可以的。我想弄清楚如何为 Safari 工具栏扩展执行此操作。工具栏 HTML 内容和 AJAX 请求都在同一个“页面”上。该页面包含用于 AJAX 调用的 JS。 XHR/AJAX 调用需要随页面的会话 cookie 一起发送以获得正确的响应。我不需要对 Chrome 进行任何特殊处理,它只知道这样做。不知道究竟需要在 Safari 上做什么。
【解决方案2】:

我在使用 Safari 5.1.2 for Windows 时遇到了这个问题,但在升级到当前版本 (5.1.7) 后问题就消失了。也许他们将其固定在某个中间版本上。它也适用于 Mac OS X 的 Safari 5.1.3。

【讨论】:

  • 谢谢!这些都是超级新闻,现在这意味着我也可以继续开发 Safari 了 :)
  • 有趣,对我来说,它最初是在我开发 Safari 扩展 5.x(忘记确切版本)时工作的,它在 Windows 和 Mac 上工作。从那时起,它在我可以使用 5.x+ 的所有版本的 Safari 中都停止工作。所以也许对我来说,它曾经一直有效,直到 Apple 将 Safari 证券化。
【解决方案3】:

Cookie 可以选择标记为 HttpOnly 或 Secure。如果它没有传递它们,您可能正试图从 HTTPS 登录后登录页面访问同一站点上的 HTTP 资源,因此浏览器将不允许通过非安全链接发送安全 cookie。实际上,HTTP 和 HTTPS 站点被视为独立的。

您要么需要确保在登录后将浏览器重定向到 HTTP 并设置 HttpOnly cookie,要么只需通过 HTTPS 执行 XMLHttpRequest。这会更安全,并且不会真正增加太多的服务器开销(它曾经在硬件速度很慢时使用,但谷歌表示当 Gmail 转而使用 HTTPS 作为默认设置时,它对服务器负载的影响不会超过几个百分比)。

尝试将整个站点设置为通过 HTTPS 运行,看看是否可以解决问题。此外,使用firebugfirecookie extension 查看cookie 是否启用了这些选项中的任何一个(右侧两列)。

【讨论】:

  • Firefox 和 Chrome 在这两种情况下都运行良好(https 和 http)。这是Safari如何处理扩展中的cookie的问题
  • 是的,我也有同样的问题?有人找到解决方案了吗?
【解决方案4】:

Cookie 不能是“会话 cookie”,它们必须是持久的。设置到期日期。

需要在服务器端完成。例如,对于 Node.js/Express 是这样的:

var session = require('cookie-session');
…
var cookieExpires = new Date();
cookieExpires.setDate(cookieExpires.getDate() + 1); // Set 1 day cookie lifetime
…
app.use(
    session({
        …
        name: 'session',
        expires: cookieExpires
    }))
…

【讨论】:

  • 您也可以在客户端创建 cookie,例如使用这个 jQuery 插件:plugins.jquery.com/cookie
  • @A.L 你可以,但通常是服务器发起会话,而不是客户端。
  • 我不明白你为什么说会话,原始问题中没有提到。
  • 那么您将如何处理会话 cookie?假设您无法控制服务器端。或者你在这种情况下不走运?
  • @大卫。我正在谈论一个案例,当您为自己的服务开发扩展并且可以修改服务器端时。如果您使用 3rd-party 服务,则可能没有好消息,除非您可以尝试编写代理 Web 服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2022-09-30
  • 1970-01-01
相关资源
最近更新 更多