我在这里失去了理智 - 我正在调查一个问题,我拥有的应用程序中的某些注销功能无法正常工作,因为身份验证 cookie 未被清除。问题是我们的“注销”端点确实在响应中包含适当的
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-cookie
中成功地使用了带有过去日期的 expires
,它甚至被编入了 RFC6265 作为请求客户端删除 cookie 的可接受方式:
最后,要删除一个 cookie,服务器返回一个 Set-Cookie 标头 过期日期。服务器将成功 仅当 Path 和 Domain 属性在 Set-Cookie 标头匹配 cookie 时使用的值 已创建。
所以我需要设置一个
expires
过去的日期来清除cookie ...但是这样做会导致浏览器拒绝它吗?有谁知道这里发生了什么?
明确地说,我已经检查了 cookie 名称、路径、
secure
和 SameSite
匹配(更新:我怀疑因为我没有明确指定 SameSite 这可能是原因,但在确保 cookie 是用SameSite=None
设置和清除它仍然不起作用)。
据我所知,该消息是无害的——根据我的测试,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;
该消息似乎是不必要的,并且有 错误报告 关于它。错误报告最近已更新,注意到这已在 Firefox 114 中修复。
在 cookie 值中使用 null 、 false 或空字符串时会发生这种情况。 它仅在 Firefox 中被标记为警告。 其他浏览器不显示此警告。
我今天遇到了类似的问题,错误消息与 OP 相同。
这发生在过去,我的解决方案是,我没有设置过去的时间,而是将值设置为空(作为故障保护),并将“过期”设置为
'time() + 1'
(所以未来的时间与 cookie几乎立即过期)。
setcookie('cookiename','',[
'expires' => time() + 1,
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'],
'secure' => true,
'samesite' => 'strict'
]);
不幸的是,这个变通办法今天似乎突然失败了,而那个失败does似乎是Firefox独有的。 (所以,是的,也许是 FF 错误?)
Chrome 和 Vivaldi 仍然可以正常使用它。我还没有在 Safari 和 Edge 上测试过。