设置会话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的最佳方法是什么?
感谢你的回答和时间。
更新:澄清问题的症状:legacyCookieName
cookie没有设置(SameSite
属性没有值),导致在迁移到新的cookie设置之前登录的现有用户无法注销网站。
即使我为这个问题做了一个变通方法(见标记的答案),如果有人提供一个更好的工作解决方案,而赏金是有效的,奖品是你的。
在尝试了各种技巧并调整了遗留cookie删除API调用的设置后,我得出结论,到目前为止,有一个解决方法可以解决所描述的错误:
- 为响应添加一个新的cookie,如
authProtocolVersion
,值如1
,如果会话涉及到请求处理。 - 如果这个cookie在请求到达的阶段已经存在,并且请求必须与会话交互,这将更新会话cookie分析行为以跳过/忽略
legacySyssionCookie
,即使它仍然存在,并且newCookieName
在请求到达时不存在。 - 在注销
clearOneSessionCookie
调用SameSite
的所有可能组合期间仍然发送注销cookie清理-未设置,none
,lax
,strict
,以确保最终遗留的验证cookie将被清除,一旦cookie清理错误将在浏览器端修复。
与新的chrome更新
如果你没有指定sameSite,则默认为sameSite:'lax'。
所以如果你设置了一个cookie与sameSite:'lax'和clearCookie没有sameSite属性,然后cookie被删除。因为没有相同的网站= samesite:'lax'