2013-10-14 37 views
2

我相信我已經配置好了一切丟失:節點護照會在後續調用

app.configure(function() { 
    app.use(express.cookieParser('secret message')); // secret it set here in new version of express or connect 
    app.use(express.bodyParser()); 
    app.use(express.session()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
}); 

當請求被設置爲「登陸」 使用正確的憑據:

app.post('/api/login', passport.authenticate('local'), function (req, res, next) { 
    console.log(req.session.passport); // {"user":"5259f2739d4323000a000003"} 
}); 

req.session.passport已填充:

"passport": {"user":"5259f2739d4323000a000003"} 

然而,當呼叫到由:

app.post('/api/checklogin', function (req, res, next) { 
    console.log(req.session.passport); // {} 
}) 

req.session.passport丟失:

"passport":{} 

這兩次,req.session看起來是這樣的:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}} 

**護照對象雖然明顯不同,如上所述

我假設我已正確配置serializeUser,因爲它正確設置了此屬性。

我不完全確定Passport如何創建會話cookie以及這些cookie如何持續存在。

我認爲req.session.passport應該保留用戶屬性,但它似乎護照對象之一:

  1. 重置每次通話
  2. 實際上並不保存護照性質的會議
  3. 該會話永遠不會創建

我擔心我可能會忽略一些很大的東西 - 可能是我可能需要做的事情,護照做的事情我不直接爲我處理。

我不知道有什麼方法來測試會話是否由Passport創建。

任何意見或幫助真的很感激。這是一場多日的鬥爭。

+0

你可以顯示你的'deserializeUser'嗎? – robertklep

回答

5

您使用的是羣集設置嗎?如果是這樣,則需要停止使用默認的MemoryStore,並切換到connect-redis之類的內容,以便應用的不同實例可以訪問共享會話數據。

+0

我不是使用集羣設置嗎?爲什麼默認的MemoryStore不起作用。我不相信我創建了多個實例 – TaylorMac

+0

感謝您的幫助Jared – TaylorMac

+3

您能解釋一下實際問題嗎?我遇到了完全相同的問題,但切換到Redis存儲不能解決問題。 'deserializeUser'函數在連續調用中仍然不會被調用,也不會從先前的序列化值中恢復會話的'passport'屬性。 –