Passport 的注销功能是否会删除 cookie?如果不是,它是如何工作的?

Ada*_*ner 5 javascript authentication node.js passport-local passport.js

文档

Passport 在 req(也称为 logOut())上公开了一个 logout() 函数,可以从任何需要终止登录会话的路由处理程序调用该函数。调用 logout() 将删除 req.user 属性并清除登录会话(如果有)。

app.get('/logout', function(req, res){   req.logout();  
res.redirect('/'); });
Run Code Online (Sandbox Code Playgroud)

通过阅读本文并测试自己,似乎并没有logout从客户端中删除 cookie。据我了解,当客户端发出请求时,它会发送它的 cookie,Passport 将其反序列化并转换为req.user.

假设logout不删除cookie,并且Passport 使用cookie 来确定用户是否登录,该logout函数实际上是如何将用户注销的?

Ada*_*ner 8

大约四年后我遇到了这个问题,幸运的是,我想我现在明白了。

Passport 的logout功能不会为您清除会话 ID cookie。然而,这实际上不是问题。我会解释为什么。

当您登录时,这是如何工作的。当您向服务器发送请求时,会话 ID cookie 将与请求一起发送。然后服务器获取该会话 ID,查找具有活动会话的相应用户,并req.user为您填充。

话虽如此,想想如果您注销会发生什么,但不要清除该会话 ID cookie。下次发送请求时,cookie 仍会一起发送,因为它没有被清除。但是接下来会发生什么?它将尝试查找具有活动会话的相应用户......但它不会找到任何东西!所以req.user最终不会被填充。这就是为什么该 cookie 是否被删除并不是什么大问题。

  • 实际上这可能是一个问题,并导致会话固定攻击。如果您没有在注销时显式销毁会话,请确保在身份验证时重新生成会话 ID(不过,您应该始终在登录期间重新生成会话 ID)。如果不这样做,攻击者可以使用他的帐户登录,然后注销,并在受害者的浏览器中使用生成的 cookie(会话 ID + 签名)。然后,当受害者连接到服务器时,攻击者就已经知道会话 ID。 (2认同)