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

时间:2016-02-12 09:44:13

标签: node.js express passport.js passport-local

我在开发中使用带有护照的node / express。我看到一篇文章说:

  

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

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

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

2 个答案:

答案 0 :(得分:33)

  

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

简而言之

序列化的用户对象存储在req.user PassportJS req.session.passport.userExpress取自Passport's deserializeUser Express Express { {1}}方法。

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

serializeUser使用deserializeUser的内容借助serializeUserdeserializeUser方法跟踪经过身份验证的用户(有关{{1}工作流程的详细信息}和Express在此SO question中查看我的答案。

Express负责创建会话。 什么时候会话被创建?那时session没有检测到会话cookie。因此,在passportapp文件中组织server.jssession配置的顺序非常重要。如果您将passportstatic 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-sessionMemoryStore一起使用,数据将保存在节点进程的内存中,并在sessionID上建立索引。在这里查看商店的initialization,此处查看storing数据。

你可以创建一个商店,将数据序列化到cookie,但compatible session stores中没有列出这些数据。

相关问题