2016-02-12 78 views
13

我正在使用节点/表达护照在我的发展。我碰到一篇文章说:护照js如何在会话中存储用户对象?

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

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

我认为这是保存在用户sessionid饼干开始,但似乎这是不是这样的,因为我仍然可以访问我的用户对象与req.session.passport.user

回答

19

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

在短

序列化用户目的是通过从req.session.passport.user采取(其由Express填充)与Passport'sdeserializeUser方法的帮助PassportJS存储在req.user

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

PassportJS使用的req.session内容来跟踪验证用户的用serializeUserdeserializeUser方法的帮助下(有关的serializeUserdeserializeUser工作流程的更多信息请参阅我的答案在本SO question)。

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

见我回答这个SO question,在那里我有提到关于静态内容的访问,以及如何有选择地应用passport一定的路线,而不是默认的(你可能不需要所有路由认证 - 因此你能避免不必要的session store lookupde-serialization通过仅将会话附加到映射到安全URLS的请求见下文)。

//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 
}); 

有一个惊人的tutorial,我强烈建议你阅读,如果你想了解PassportJS的工作流程。

0

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

如果您使用express-sessionMemoryStore,数据将被保存在节点进程的内存中,并在sessionID上索引。在这里寻找商店的initialization和这里的storing的数据。

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