【问题标题】:Express clearCookie does not work as expected with options supplied使用提供的选项时,Express clearCookie 无法按预期工作
【发布时间】:2022-06-12 04:22:31
【问题描述】:

设置会话cookie的代码如下:

                        res.cookie(newCookieName, sessionCookie, {
                            domain: getCookiesDomain(),
                            maxAge: ms('30 days'),
                            secure: true,
                            httpOnly: true,
                            sameSite: 'lax'
                        });

在注销时我们这样做:

function clearOneSessionCookie(res:Response, cookieName, sameSite?: 'lax'|'strict'|'none'):void {
    if (sameSite) {
        res.clearCookie(cookieName, {
            domain: getCookiesDomain(),
            maxAge: -1000,
            httpOnly: true,
            secure: true,
            sameSite: sameSite
        });
    } else {
        res.clearCookie(cookieName, {
            domain: getCookiesDomain(),
            maxAge: -1000,
            httpOnly: true,
            secure: true
        });
    }
}



    clearOneSessionCookie(res, newCookieName);
    clearOneSessionCookie(res, newCookieName, 'lax');
    clearOneSessionCookie(res, newCookieName,'strict');
    clearOneSessionCookie(res, legacyCookieName);
    clearOneSessionCookie(res, legacyCookieName, 'lax');
    clearOneSessionCookie(res, legacyCookieName,'strict');

我们应用了clearOneSessionCookie 的所有可能选项,因为在我们项目的不同阶段转移到不同的cookie 名称和选项时,我们使用了不同的sameSite 选项。

我什至更新到最新的expresscookie-parser 包,希望能解决这个问题,但到目前为止还没有效果。

注销请求后,谷歌浏览器的 Cookies 选项卡上显示以下信息:

请求 Cookie:

  • old_cookie_name: domain = www.example.com, path = /, expires = Future_Date_1, HttpOnly = yes, Secure = yes, SameSite=[未设置!]
  • new_cookie_name: domain = www.example.com, path = /, expires = Future_Date_2, HttpOnly = yes, Secure = yes, SameSite=Lax

响应 Cookie:

  • old_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Lax

  • old_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Strict

  • new_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Lax

  • new_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: Strict

注意现在有行像

  • old_cookie_name: domain = www.example.com, path = /, max-age: -1000 ms, HttpOnly = yes, Secure = yes, Same-Site: [未设置]

所以,看来是调用

clearOneSessionCookie(res, legacyCookieName);

不起作用或浏览器无法理解/识别。 这个特定的set-cookie 已被忽略:

set-cookie: old_cookie_name=; Max-Age=-1; Domain=www.example.com; Path=/; Expires=Sat, 04 Jun 2022 15:27:10 GMT; HttpOnly; Secure

清除具有旧名称且未应用显式 Same-Site 值的 cookie 的最佳方法是什么?

感谢您的回答和时间。

更新: 问题症状的澄清: legacyCookieName cookie 未设置(SameSite 属性没有值)作为结果,在迁移到新 cookie 设置之前登录的现有用户无法退出网站。

【问题讨论】:

  • cookies 选项卡仅与单个请求/响应有关,重要的是应用程序选项卡上的“存储 > Cookies”。如果 cookie 在那里消失了,你就准备好了。此外,在清除 cookie 时,sameSite 无关紧要。并且当多次设置一个 cookie 时(使用不同的sameSite 值),只有一个存在。
  • 我知道网络选项卡上 cookie 信息的按请求性质。可能是我不够清楚,但是其中一个 cookie(具有未设置 SameSite 属性的旧 cookie 名称仍然存在,并在注销 API POST 后以 JSON 响应请求发送,作为重定向到网站主页的一部分。

标签: node.js express google-chrome http cookies


【解决方案1】:

新的 chrome 更新

如果您不指定 sameSite,则默认为 sameSite:'lax'。

因此,如果您设置了一个带有 sameSite:'lax' 和 clearCookie 且没有 SameSite 属性的 cookie,那么该 cookie 将被删除。因为没有同一个站点=sameSite:'lax'

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多