2016-01-08 42 views
13

我必須知道什麼時候調用Serialize和Deserialize,爲了測試我已經放了alert(user.id)但沒有發生任何操作。當Serialize和Deserialize調用護照js

我有一些疑問:

  • 從哪裏user對象passport.serializeUser(function(user, done){...已收到
  • 什麼樣的作用發揮process.nextTick()這裏
  • 如何調用回調函數即function(req, email, password, done),如果我發送多個表單值如(姓名,電子郵件,密碼,地址,手機)。

下面是代碼: - :

app.post('/login', 
    passport.authenticate('local'), 
     function(req, res) { 
     // If this function gets called, authentication was successful. 
     // `req.user` contains the authenticated user. 
     res.redirect('/users/' + req.user.username); 
}); 

在你的項目,請找到該代碼,並檢查它看起來像上面而不是當你驗證用戶

//config/passport.js 

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

var User   = require('../app/models/user'); 

module.exports = function(passport) { 

    passport.serializeUser(function(user, done) { 
     alert(user.id);//// Here is my testing alert 
     done(null, user.id); 
    }); 

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


passport.use('local-signup', new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 
     process.nextTick(function() { 
     User.findOne({ 'local.email' : email }, function(err, user) { 

      if (err) 
       return done(err); 

      if (user) { 
       return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
      } else { 
       var newUser   = new User(); 
       newUser.local.email = email; 
       newUser.local.password = newUser.generateHash(password); 
       newUser.save(function(err) { 
        if (err) 
         throw err; 
        return done(null, newUser); 
       }); 
      } 

     });  

     }); 

    })); 
} 

回答

13

根據我對項目使用Passport.js的知識,我會盡力回答。

首先,沒有什麼(功能)像的NodeJS alert(),所以你將不得不重命名alert(...)這是瀏覽器的事情,像console.log(...)

我看不到你的app.js文件,以便,我會繼續嘗試根據我使用passportjs的經驗回答您的查詢。

假設你在app.js具有以下(順序很重要,看here

var passport = require('passport'); 
// express-session configs here 
// following is invoked on each request. 
app.use(passport.initialize()); 

passport.initialize()passport.session()調用每一個請求,他們是導致serializeUser用戶ID加載到req.user的那些如果在服務器中找到序列化的用戶(當使用mongodb時,如果用戶存在於mongodb中)。

passport.session()調用對每個請求,這將查詢使用最初由serializeUser加載到req.user和存儲關於用戶在req.user的更多信息user._id的mongodb的deserializeUser

process.nextTick()推遲迴調的執行,直到事件循環的下一個傳遞。數據庫查詢本質上是同步的,process.nextTick()使其異步。有很多關於這個的教程,Google它。

正如前面提到的,app.use(passport.session())運行deserializeUser對每個請求(基本上每個要求 - 如果你passport.session()再經過列出您快速靜態路徑CONFIGS即使對於負載靜態文件的請求)。在我的情況下,我需要在特定路由上進行身份驗證,並且我想要進行身份驗證,只有當用戶訪問安全路徑時纔會發生此類情況,因此,我必須在條件符合以下特定模式時調用passport.session()

app.use(function(req, res, next){ 
    if(req.url.match('/xxxx/secure')) 
    passport.session()(req, res, next) 
    else 
    next(); // do not invoke passport 
}); 

替換app.use(passport.session())與上述幫助。現在只有當用戶訪問安全路徑時,纔會調用護照進程,包括serializeUserdeserializeUser。我不確定上述是否是完美的解決方案,但是,它大大減少了用戶(非序列化用戶)對mongodb不必要的查詢量。

不確定你在最後一點要問什麼。有相當多的教程展示瞭如何爲本地以及社交授權實現passportjs。你應該看看周圍。

更多的閱讀

更多有趣的事實在session是如何加載用戶,請閱讀我在這SO question答案。它描述Express做什麼? PassportJS做什麼?並且您將輕鬆理解工作流程(文檔使其易混淆且不明確)。

+0

我有一個問題,當你說:「passport.initialize()和passport.session()...他們是那些導致serializeUser加載**用戶ID到req.user如果一個序列化的用戶被發現在服務器(whe n使用mongodb,如果用戶存在於mongodb中)。 **「用戶ID從哪裏來?當你說」如果用戶存在於mongodb中「,它會自動查找用戶模型嗎? –

+0

你的代碼可以重構爲'if(req.url.match('/ xxx'))passport.session(); next();' – NERDYLIZARD

0

系列化發生如下所示:

passport.authenticate('local', { session: false }) 

另請檢查您的項目使用會議。官方文檔見Sessions

3

你的第三個問題是

如何調用回調函數

function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile). 

按我的理解,第四個參數作爲需要一個回呼function.you不能像使用,並拋出錯誤

function(req, email, password, mobile, address, done)