Express clearCookie不像预期的那样使用提供的选项



设置会话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选项。

我甚至更新到最新的express,cookie-parser软件包希望修复,但迄今为止没有效果。

在登出请求后,Google Chrome浏览器的Cookies选项卡显示以下信息:

请求cookie:

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

响应饼干:

  • 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: [not set]

所以,似乎调用

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的最佳方法是什么?

感谢你的回答和时间。

更新:澄清问题的症状:legacyCookieNamecookie没有设置(SameSite属性没有值),导致在迁移到新的cookie设置之前登录的现有用户无法注销网站。

即使我为这个问题做了一个变通方法(见标记的答案),如果有人提供一个更好的工作解决方案,而赏金是有效的,奖品是你的。

在尝试了各种技巧并调整了遗留cookie删除API调用的设置后,我得出结论,到目前为止,有一个解决方法可以解决所描述的错误:

  1. 为响应添加一个新的cookie,如authProtocolVersion,值如1,如果会话涉及到请求处理。
  2. 如果这个cookie在请求到达的阶段已经存在,并且请求必须与会话交互,这将更新会话cookie分析行为以跳过/忽略legacySyssionCookie,即使它仍然存在,并且newCookieName在请求到达时不存在。
  3. 在注销clearOneSessionCookie调用SameSite的所有可能组合期间仍然发送注销cookie清理-未设置,none,lax,strict,以确保最终遗留的验证cookie将被清除,一旦cookie清理错误将在浏览器端修复。

与新的chrome更新

如果你没有指定sameSite,则默认为sameSite:'lax'。

所以如果你设置了一个cookie与sameSite:'lax'和clearCookie没有sameSite属性,然后cookie被删除。因为没有相同的网站= samesite:'lax'

最新更新