我在开发中使用带有护照的节点/表达式。我碰到一篇文章说:
Express加载会话数据并将其附加到请求。当护照在会话中存储序列化的用户时,可以在req.session.passport.user中找到序列化的用户对象。
但是令我惊讶的是,浏览器cookie中的sessionID存储的值在登录前后都保持不变。那么,序列化的用户对象存储在哪里?
我以为它最初存储在用户sessionidcookie中,但似乎不是这样,因为我仍然可以使用req.session.passport.user
sessionid
req.session.passport.user
那么,序列化的用户对象存储在哪里?
简而言之
序列化的用户对象在method 的帮助下req.user通过PassportJSfrom进行存储(由req.session.passport.user填充Express)Passport's deserializeUser。
req.user
PassportJS
Express
Passport's
deserializeUser
Express将会话对象的ID添加到用户浏览器上的Cookie中,该Cookie将被发送回以在每个请求的标头中表示。Express然后从标题中获取ID,然后搜索会话存储区(例如Mongo或其他内容),然后找到条目并将其加载到中req.session。
req.session
PassportJS在和方法req.session的帮助下serializeUser,使用的内容跟踪经过身份验证的用户deserializeUser(有关的工作流程的更多信息serializeUser,deserializeUser请参阅此SO 问题中的答案)。
serializeUser
Express负责创建会话。 会话何时创建? 那是当Express不检测会话cookie时。因此,您在或文件中组织session和passport配置的顺序非常重要。如果在上面声明了and configs,那么对的所有请求也将获得一个会话,这是不好的。app``server.js``session``passport``static directory configs``static content
session
passport
app``server.js``session``passport``static directory configs``static content
请参阅我对这个SO 问题的回答,在这里我提到了静态内容访问以及如何有选择地应用于passport某些路由,而不是默认路由(您可能不需要对所有路由进行身份验证- 因此可以避免不必要的连接session store lookup并de- serialization附加会话仅适用于映射到安全网址的请求(请参见下文)。
session store lookup
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的工作流程,我强烈建议您阅读一本很棒的教程。