护照js如何在会话中存储用户对象?

我正在使用节点/expression护照在我的发展。 我遇到一篇文章说:

Express加载会话数据并将其附加到请求。 由于护照将序列化的用户存储在会话中,因此可以在req.session.passport.user中find序列化的用户对象。

但令我惊讶的是,浏览器cookie中sessionID存储的值在login前后保持不变。 那么序列化的用户对象存储在哪里呢?

我以为它最初存储在用户sessionid cookie中,但似乎并非如此,因为我仍然可以通过req.session.passport.user访问我的用户对象

那么序列化的用户对象存储在哪里呢?

简而言之

序列化的用户对象通过PassportJS req.userreq.session.passport.user (由Express填充)中的PassportJS存储在req.user

Express将会话对象的id添加到用户浏览器中的cookie中,该cookie会在每个请求的头部发回。 Express然后从标题中获取id并search会话存储(例如,Mongo或其他)并find条目并将其加载到req.session

PassportJS使用req.session的内容通过req.sessionreq.session方法(有关serializeUserreq.session工作stream程的更多信息,请参阅我在此SO 问题中的答案)跟踪已validation的用户。

Express负责创build会话。 会议什么时候创build? 这是当Express不检测会话cookie。 所以你在你的appserver.js文件中组织sessionpassportconfiguration的顺序是非常重要的。 如果您将会话和passportconfiguration声明为static directory configs那么对static content所有请求也将得到一个会话,这是不好的。

看到我对这个SO 问题的回答 ,在那里我提到了静态内容访问,以及如何select性地将passport应用到某些路由,而不是默认(您可能不需要authentication所有路由 – 因此可以避免不必要的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 }); 

如果您想了解PassportJS的工作stream程,我强烈build议您阅读一个令人惊叹的教程 。

您可以将cookie中的sessionID视为存储会话数据的数据库的关键字。 取决于您使用express的会话处理程序,以及使用数据的存储策略将以不同的方式存储。 这意味着在login之前,login成功之后,甚至在用户注销之后,sessionID可以是相同的值。

如果使用MemoryStore的快速会话 ,则数据将被保存在节点进程的内存中,并在会话ID上进行索引。 在这里寻找商店的初始化 ,并在这里存储数据。

您可以创build一个将数据序列化到cookie的商店,但在兼容的会话存储中没有列出这些商店 。