那么序列化的用户对象存放在哪里呢?
简而言之
在Passport'sdeserializeUser方法的帮助下,序列化的用户对象由req.session.passport.user(由Express填充)中的PassportJS存储在req.user中。
Express 将会话对象的 id 添加到用户浏览器上的 cookie 中,该 cookie 在每个请求的标头中发送回以表示。 Express 然后从标头中获取 id 并搜索会话存储(即 Mongo 或其他)并找到条目并将其加载到 req.session。
PassportJS 使用req.session 的内容在serializeUser 和deserializeUser 方法的帮助下跟踪经过身份验证的用户(有关serializeUser 和deserializeUser 工作流程的更多信息,请参阅我的回答这个 SOquestion)。
Express 负责创建会话。 什么时候创建会话? 那是Express 没有检测到会话 cookie。因此,您在app 或server.js 文件中组织session 和passport 配置的顺序非常重要。如果您在static directory configs 上方声明您的session 和passport 配置,那么对static content 的所有请求也将获得一个会话,这是不好的。
查看我对此 SO question 的回答,其中我提到了静态内容访问以及如何选择性地将 passport 应用于某些路由,而不是默认路由(您可能不需要验证所有路由 - 因此您可以避免不必要的session store lookup 和de-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。