2016-04-10 81 views
5

使用passport.js,我以此方式編寫路由,因此我可以訪問MongoDb文檔userDoc。但是,這樣做時... passport.serializeUser()將永遠不會被調用,並且req對象將會丟失userPassport serializeUser()未通過此身份驗證()回調調用

auth.route('/auth/facebook/callback') 
    .get(function(req, res, next) { 
    passport.authenticate('facebook', function(err, userDoc, info) { 
     if (err) { return next(err); } 
     // I don't think !userDoc will ever happen because of mongo upsert 
     if (!userDoc) { return res.redirect('/login'); } 
     res.cookie('facebookPicUrl', userDoc.value.facebook.picture, {maxAge : 9999999, 
     httpOnly: false, 
     secure: false, 
     signed: false 
     }); 

     res.redirect('http://localhost:9000/users') 
    })(req, res, next); 
    }); 

但如果我這樣寫吧,req.user是有,因爲它應該是:

auth.route('/auth/facebook/callback') 
    .get(passport.authenticate('facebook', { failureRedirect: '/login' }), 
     function(req, res) { 
     res.redirect('http://localhost:9000/users') 
    }); 

我怎樣才能使這個地方passport.serializeUser被調用,user存在於req我也有訪問mongoDb對象?

回答

9

由於您正在使用自定義身份驗證回調,因此您有責任建立會話。

請注意,使用定製的回調時,就變成了應用程序的 責任建立一個會話(通過調用req.login())和 發送響應。

req.login()一旦登錄操作完成user對象請求對象req分配作爲req.user

例如,您可以看到文檔中req.login()顯式調用自定義回調:

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 
+0

哇!據我瞭解,這在Passport.js網站上沒有記錄。他們說,passport.authenticate()調用req.login(),但我不知道如果提供自定義回調,它必須手動調用。文檔太模糊了! – OzzyTheGiant

相關問題