护照js如何在会话中存储用户对象?
我正在使用节点/expression护照在我的发展。 我遇到一篇文章说:
Express加载会话数据并将其附加到请求。 由于护照将序列化的用户存储在会话中,因此可以在req.session.passport.user中find序列化的用户对象。
但令我惊讶的是,浏览器cookie中sessionID存储的值在login前后保持不变。 那么序列化的用户对象存储在哪里呢?
我以为它最初存储在用户sessionid
cookie中,但似乎并非如此,因为我仍然可以通过req.session.passport.user
访问我的用户对象
那么序列化的用户对象存储在哪里呢?
简而言之
序列化的用户对象通过PassportJS
req.user
从req.session.passport.user
(由Express
填充)中的PassportJS
存储在req.user
。
Express
将会话对象的id添加到用户浏览器中的cookie中,该cookie会在每个请求的头部发回。 Express
然后从标题中获取id并search会话存储(例如,Mongo或其他)并find条目并将其加载到req.session
。
PassportJS
使用req.session
的内容通过req.session
和req.session
方法(有关serializeUser
和req.session
工作stream程的更多信息,请参阅我在此SO 问题中的答案)跟踪已validation的用户。
Express
负责创build会话。 会议什么时候创build? 这是当Express
不检测会话cookie。 所以你在你的app
或server.js
文件中组织session
和passport
configuration的顺序是非常重要的。 如果您将会话和passport
configuration声明为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的商店,但在兼容的会话存储中没有列出这些商店 。
- ReactJs前端和Passport NodeJs后端
- 如何使用koa通用会话()的护照?
- 如何允许+护照本地策略的用户字符?
- Nodejs Passportvalidationcallback没有被错误地调用
- 与Mysql的本地令牌的Nodejs Passport
- 如何使用护照和快递显示自定义错误消息
- Mongoose schematype.castForQuery错误。 用户身份validation失败
- req.session.passport和req.user空,serializeUser和deserializeUser都不会被调用
- 如何在使用护照-http Basic +护照 – 本地组合时防止www-authenticate头