我在开发中使用带有护照的node / express。我看到一篇文章说:
Express加载会话数据并将其附加到req。由于passport将序列化用户存储在会话中,因此可以在req.session.passport.user中找到序列化的用户对象。
但令我惊讶的是,浏览器cookie中sessionID存储的值在登录前后保持不变。那么序列化用户对象存储在哪里?
我认为它最初存储在用户sessionid
Cookie中,但似乎并非如此,因为我仍然可以使用req.session.passport.user
访问我的用户对象
答案 0 :(得分:33)
那么序列化用户对象存储在哪里?
简而言之
序列化的用户对象存储在req.user
PassportJS
req.session.passport.user
,Express
取自Passport's
deserializeUser
Express
Express
{ {1}}方法。
req.session
将会话对象的id添加到用户浏览器的cookie中,该cookie在每个请求的头部中被发回。 PassportJS
然后从标题中获取id并搜索会话存储(即Mongo或其他)并找到该条目并将其加载到req.session
。
serializeUser
使用deserializeUser
的内容借助serializeUser
和deserializeUser
方法跟踪经过身份验证的用户(有关{{1}工作流程的详细信息}和Express
在此SO question中查看我的答案。
Express
负责创建会话。 什么时候会话被创建?那时session
没有检测到会话cookie。因此,在passport
或app
文件中组织server.js
和session
配置的顺序非常重要。如果您将passport
和static directory configs
配置声明为static content
以上,则passport
的所有请求也会获得一个会话,但这并不好。
请参阅我对此SO question的回答,其中我提到了静态内容访问以及如何有选择地将session store lookup
应用于某些路由,而不是默认(您可能不需要对所有路由进行身份验证)路由 - 因此您可以通过仅将会话附加到映射到安全URL的请求来避免不必要的de-serialization
和//selectively applying passport to only secure urls
app.use(function(req, res, next){
if(req.url.match('/xxxx/secure'))
passport.session()(req, res, next)
else
next(); // do not invoke passport
});
,如下所示)。
window.jwplayer = jwplayer;
如果您想了解PassportJS的工作流程,我强烈建议您阅读一个令人惊讶的tutorial。
答案 1 :(得分:2)
您可以查看cookie中的sessionID
作为存储会话数据的数据库的密钥。根据您使用express的会话处理程序以及您使用的存储策略,数据将以不同方式存储。这意味着sessionID在登录之前,成功登录之后,甚至在用户注销之后都可以是相同的值。
如果将express-session与MemoryStore
一起使用,数据将保存在节点进程的内存中,并在sessionID上建立索引。在这里查看商店的initialization,此处查看storing数据。
你可以创建一个商店,将数据序列化到cookie,但compatible session stores中没有列出这些数据。