【问题标题】:Cannot remove a cookie - Firefox rejecting cookies from the past无法删除 cookie - Firefox 拒绝过去的 cookie
【发布时间】:2021-03-10 06:51:30
【问题描述】:

我在这里疯了 - 我正在研究一个问题,即我拥有的应用程序中的某些注销功能无法正常工作,因为身份验证 cookie 没有被清除。问题是我们的“signout”端点确实在响应中包含了适当的set-cookie 标头——这就是我在 Firefox 中看到的原始响应:

set-cookie: Auth.myapp=; domain=app.mydomain.com; expires=Thu, 26-Nov-2020 13:19:20 GMT; path=/; secure; HttpOnly

Firefox 在控制台中报告此错误:

Cookie “Auth.myapp”已被拒绝,因为它已经过期了

这有点令人困惑,我之前不仅成功地使用了set-cookieexpires 中的过去日期,它甚至被编入RFC6265 作为请求客户端删除cookie 的可接受方式:

最后,为了移除一个cookie,服务器返回一个Set-Cookie header 过期日期在过去。服务器会成功 仅当 Path 和 Domain 属性在 Set-Cookie 标头匹配 cookie 时使用的值 已创建。

所以我需要在过去设置一个 expires 日期来清除 cookie ...但是这样做会导致浏览器拒绝它?有谁知道这里发生了什么?

为了清楚起见,我检查了 cookie 名称、路径、secureSameSite 是否匹配(更新:我怀疑因为我没有明确指定 SameSite 这可能是原因,但在确保cookie 已使用SameSite=None 设置和清除,但仍无法正常工作)。

【问题讨论】:

  • 这里可能涉及不同的子域(例如一个请求没有,一个请求)?
  • 不错的建议,但这都在同一个子域上

标签: firefox cookies setcookie


【解决方案1】:

据我所知,该消息是无害的——根据我的测试,cookie 确实被删除了。谷歌搜索该消息会导致this changeset,这表明删除确实发生了,只是需要额外的日志记录。

       // If the new cookie has expired -- i.e. the intent was simply to delete
       // the old cookie -- then we're done.
       if (aCookie->Expiry() <= currentTime) {
         COOKIE_LOGFAILURE(SET_COOKIE, aHostURI, aCookieHeader,
                           "previously stored cookie was deleted");
+        CookieLogging::LogMessageToConsole(
+            aCRC, aHostURI, nsIScriptError::warningFlag,
+            CONSOLE_REJECTION_CATEGORY, "CookieRejectedExpired"_ns,
+            AutoTArray<nsString, 1>{
+                NS_ConvertUTF8toUTF16(aCookie->Name()),
+            });
         NotifyChanged(oldCookie, u"deleted", oldCookieIsSession);
         return;

不过,这条消息似乎是不必要的,而且有 a bug report 关于它。

【讨论】:

  • 很好发现,所以这个错误可能与我看到的问题无关。嗯
  • 在我的情况下,cookie 没有被删除,因为 Webpack 开发服务器正在摆弄它。 Firefox 给出了一个令人困惑的错误消息,但它确实遵循规范。
【解决方案2】:

在 cookie 值中使用 null 、 false 或空字符串时会发生这种情况。 它仅在 Firefox 中被标记为警告。 其他浏览器不显示此警告。

【讨论】:

    【解决方案3】:

    我今天遇到了类似的问题,错误消息与 OP 相同。

    这发生在过去,我的解决方案是,我没有设置过去的时间,而是将值设置为空(作为故障保护)并将“过期”设置为 'time() + 1'(所以未来时间cookie 几乎立即过期)。

        setcookie('cookiename','',[
            'expires' => time() + 1,
            'path' => '/',
            'domain' => $_SERVER['HTTP_HOST'],
            'secure' => true,
            'samesite' => 'strict'
            ]);
    

    不幸的是,这种解决方法今天似乎突然失败了,而且失败确实似乎是 Firefox 独有的。 (所以,是的,也许是一个 FF 错误?)

    Chrome 和 Vivaldi 仍然可以正常使用它。我还没有在 Safari 和 Edge 上进行测试。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2012-07-06
      相关资源
      最近更新 更多