2016-05-30 33 views
3

passport.js中有幾件事我不明白。Auth使用passport.js混淆語法?

1.

var passport = require('passport') 
 
    , LocalStrategy = require('passport-local').Strategy; 
 

 
passport.use(new LocalStrategy(
 
    function(username, password, done) { 
 
    User.findOne({ username: username }, function (err, user) { 
 
     if (err) { return done(err); } 
 
     if (!user) { 
 
     return done(null, false, { message: 'Incorrect username.' }); 
 
     } 
 
     if (!user.validPassword(password)) { 
 
     return done(null, false, { message: 'Incorrect password.' }); 
 
     } 
 
     return done(null, user); 
 
    }); 
 
    } 
 
));

是什麼null代表在done()功能。它似乎總是第一個參數,我對實際做了什麼感到困惑?

2.

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

 
passport.deserializeUser(function(obj, cb) { 
 
    cb(null, obj); 
 
});

什麼是序列化和反序列化呢?會話存儲在瀏覽器中時,serialize會在登錄後被調用嗎?並且反序列化是當頁面被訪問時,會話在服務器上被反序列化以驗證該用戶?

最後是什麼cb(null, user);

+1

有一個在一個的NodeJS會議通過的任何錯誤沿回調的第一個參數。你會在幾乎每個節點庫中看到這個,包括像'fs'這樣的內置模塊。所以傳遞'null'就好像說在把結果提供給回調函數之前函數內部沒有發生錯誤。 – azium

回答

2
  1. null再次參數是什麼在做()函數空表示。它似乎總是第一個參數,我對實際做了什麼感到困惑?

    • cb中的null參數是什麼(null,user);

按照慣例,使用的NodeJS錯誤-第一回調這意味着回調函數的第一個參數總是錯誤對象。如果你沒有任何錯誤,你通過null。換句話說,如果錯誤參數是null,那麼操作成功並且如果錯誤參數不是null,則發生錯誤。所有你問到的例子都適用。如果你看一下代碼,你可以看到你已經在利用這一點:

​​

此外,護照有其認證過程約定,其中,作爲他們的文件說:

如果憑據驗證回調會調用done向Passport提供經過驗證的用戶。如果憑證無效(例如,如果密碼不正確),則應使用虛假代替done來指示認證失敗。

這就是你在這裏做什麼:

User.findOne({ username: username }, function (err, user) { 

    // ... 

    if (!user) { 
    return done(null, false, { message: 'Incorrect username.' }); 
    } 
    if (!user.validPassword(password)) { 
    return done(null, false, { message: 'Incorrect password.' }); 
    } 

    // ... 

  • 什麼是序列化和反序列化呢?會話存儲在瀏覽器中時,serialize會在登錄後被調用嗎?反序列化是什麼時候訪問一個頁面,以便在服務器上反序列化會話以驗證該用戶?
  • 那麼,護照的文件說:

    如果認證成功,會話將被建立,並通過在用戶的瀏覽器設置cookie維持。每個後續請求都不包含憑據,而是標識會話的唯一Cookie。爲了支持登錄會話,Passport將序列化和反序列化會話中的用戶實例。

    這意味着,用戶登錄後,serializeUser被調用,用戶數據傳遞給回調cb

    passport.serializeUser(function(user, cb) { 
        cb(null, user); // <-- this user object 
    }); 
    

    保存在會話存儲(通常是瀏覽器的cookies)和製造在您的代碼中可用req.session.passport.user

    當用戶重新連接到您的頁面(通過刷新或離開並回來)時,此相同的數據作爲第一個參數傳遞給deserializeUser以用於檢索用戶對象。

    passport.deserializeUser(function(obj, cb) { 
        cb(null, obj); // <-- obj is the same `user` object you used in serializeUser 
    }); 
    

    你在做什麼這裏經過實際user對象的回調serializeUser,然後通過同樣的對象返回通過回調deserializeUser。這意味着您將整個用戶對象存儲在您的Cookie中,這對於玩遊戲來說是可行的,但通常不是一個好主意,因爲Cookie存儲空間有限,用戶信息通常很敏感。

    執行此操作的典型方法是將用戶標識(而不是整個用戶對象)傳遞到serializeUser中的cb以保持會話中存儲的數據量較小。當進一步的請求發生時,這個ID被傳遞到deserializeUser並且用於通常從數據庫中找到實際的用戶對象,該對象將被恢復到req.user

    下面是一個例子:

    passport.serializeUser(function(user, done) { 
        done(null, user.id); 
    }); 
    
    passport.deserializeUser(function(id, done) { 
        User.findById(id, function(err, user) { 
        done(err, user); 
        }); 
    });