2013-03-14 75 views
4

我正在考慮在節點項目中使用Passport庫(http://passportjs.org/)進行身份驗證。在節點JS中進行身份驗證的護照

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    user.get(id, function (err, user) { 
     done(err, user); 
    }); 
}); 

我很納悶:

1)不要這些被調用爲每一個需要身份驗證的請求

我通過以下護照會話功能混淆?或者當會話第一次創建時他們只被調用一次?

2)如何從我的腳本的其他部分訪問「user」中的信息?

3)對於需要認證的請求,我在哪裏放置任何附加邏輯。例如檢查是否尚未達到允許的用戶閒置時間值。

感謝(提前)對你的幫助

回答

3

1)serializeUser爲用戶創建一個會話(當認證成功)時被調用。這用於在Express會話中存儲關於用戶的某種標識信息(如獨特的用戶標識)。

deserializeUser被稱爲爲每個請求,並採取那塊從會話識別信息的由數據庫查詢的方式,或許以某種方式將其轉換回一個完整的用戶記錄,但是這真的取決於你:不是隻存儲用戶標識,您還可以將整個用戶記錄存儲在會話中,但這取決於用戶記錄的類型和所使用的會話存儲(如果可能的話)(例如,使用express.cookieSession將限制數據量你可以存儲在一個會話中)。

這是存儲整個用戶記錄可能是什麼樣子:

passport.serializeUser(function(user, done) { 
    // Here, 'user' is the result of the function called by 'new LocalStrategy()'; when 
    // you call done() below, that result will be stored in the session. 
    done(null, user); 
}); 

passport.deserializeUser(function(user, done) { 
    // Here, 'user' is what's stored in the session by serializeUser() 
    done(null, user); 
}); 

2)護照填充req.user,您可以在路線或中間件使用。

3)您可以製作一箇中間件來執行這些檢查。 This可能是一個很好的起點。