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

Posted

技术标签:

【中文标题】护照js如何在会话中存储用户对象?【英文标题】:How does passport js stores user object in session? 【发布时间】:2016-05-23 09:46:52 【问题描述】:

我在开发中使用带有护照的节点/快递。我看到一篇文章说:

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

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

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

【问题讨论】:

【参考方案1】:

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

简而言之

Passport'sdeserializeUser方法的帮助下,序列化的用户对象由req.session.passport.user(由Express填充)中的PassportJS存储在req.user中。

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

PassportJS 使用req.session 的内容在serializeUserdeserializeUser 方法的帮助下跟踪经过身份验证的用户(有关serializeUserdeserializeUser 工作流程的更多信息,请参阅我的回答这个 SOquestion)。

Express 负责创建会话。 什么时候创建会话? 那是Express 没有检测到会话 cookie。因此,您在appserver.js 文件中组织sessionpassport 配置的顺序非常重要。如果您在static directory configs 上方声明您的sessionpassport 配置,那么对static content 的所有请求也将获得一个会话,这是不好的。

查看我对此 SO question 的回答,其中我提到了静态内容访问以及如何选择性地将 passport 应用于某些路由,而不是默认路由(您可能不需要验证所有路由 - 因此您可以避免不必要的session store lookupde-serialization,方法是仅将会话附加到映射到安全 URL 的请求(见下文)。

//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 的工作流程,我强烈建议您阅读一个令人惊叹的 tutorial。

【讨论】:

【参考方案2】:

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

如果您使用express-session 和MemoryStore,数据将保存在节点进程的内存中,并在 sessionID 上进行索引。在此处查找商店的initialization,在此处查找数据的storing。

您可以创建一个将数据序列化为 cookie 的存储区,但 compatible session stores 中没有列出此类数据。

【讨论】:

以上是关于护照js如何在会话中存储用户对象?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 html5 本地存储来存储用户身份验证会话信息吗

nodejs护照身份验证令牌

NodeJS express - 如何在路由器内添加会话数据?

如何从护照中的用户对象中删除密码字段

不在护照快递服务器上保存会话

在服务器端护照js本地用户身份验证后,如何在客户端使用cookie显示用户信息?