2016-02-12 86 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中沒有列出這些商店。