Express Passport.js: req.user与req.session.passport.user的区别

16
根据这篇文章

http://toon.io/understanding-passportjs-authentication-flow/

看起来 PassportJS/Express 将已登录的用户存储在两个位置

req.user

并且

req.session.passport.user

为什么两个都需要?我该使用哪一个?当我使用passport注销时,它会同时销毁req.user和req.session.passport.user吗?

1个回答

25

在你自己的代码中,应该总是、一定使用 req.user -- 这很重要,因为如果你使用 req.session.passport.user,实际上就是从一个会话 cookie 中提取用户信息(这可能已经过时)。

与直接依赖 cookie 数据相比,始终依赖 req.user 是最好的选择,因为根据你的实现方式,那些信息可能已经过时了。

回答你的问题:如果你登出用户,那么 req.sessionreq.user 都将不再可用。


req.session.passport.user 实际上不是从会话 cookie 中提取信息吗? 除非您禁用了会话,否则 req.user 实际上只是映射到 req.session.passport.user 吗? 我看不出这两者实际上有什么不同。 现在,如果您以某种方式在 cookie 中存储实际数据(而不仅仅是会话 ID),然后通过 req.cookies 访问该数据,则它肯定可能过时,但这是完全不同的情况。 - nextgentech
不,req.session.passport.user 是从会话cookie中获取的(没有其他地方)。 这是基于cookie的会话认证的工作方式,除非您使用其他形式。 - rdegges
2
也许我们在谈论不同的事情,但这在使用MemoryStore或基于服务器的会话存储的情况下是没有意义的。在使用服务器端会话存储时,会话cookie(发送到浏览器)仅存储会话ID。所有数据仍留在服务器上。会话的整个目的是为给定用户在服务器上保持数据可用和最新。会话cookie仅允许浏览器保持与特定会话链接。通过req.session访问数据将始终包含最新的会话信息。 - nextgentech
如果会话使用cookieSession存储(其中整个会话在cookie中维护),你所说的可能是正确的,但我认为大多数人在使用“session cookie”这个术语时不是指这种情况。最常见的场景是使用服务器端会话存储,并在发送到浏览器的cookie中存储ID。 - nextgentech
这是正确的。我在推荐另一种用法时的观点是,它并不依赖于正在使用哪个会话存储,因此通常更安全。当然也有一些情况(正如你所指出的)不适用这种用法。 - rdegges

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接