2013-02-19 30 views
29

我使用Passport.js以用戶名和密碼登錄用戶。我基本上使用Passport站點的示例代碼。以下是我的代碼的相關部分(我認爲):Passport.js:認證後如何訪問用戶對象?

app.use(passport.initialize()); 
app.use(passport.session()); 

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

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

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); 
     }); 
    } 
)); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login/fail', failureFlash: false }), 
    function(req, res) { 
     // Successful login 
     //console.log("Login successful."); 
     // I CAN ACCESS req.user here 
}); 

這似乎是正確登錄。不過,我想能夠訪問代碼的其他部分,如登錄用戶的信息:

app.get('/test', function(req, res){ 
    // How can I get the user's login info here? 
    console.log(req.user); // <------ this outputs undefined 
}); 

我已簽上的其他問題,但我不知道我在做什麼這裏錯了。謝謝!

回答

5

在註冊護照中間件之前,您需要確保註冊了一個middleware,該密碼填充了req.session

例如下面通過express cookieSession middleware

app.configure(function() { 

    // some code ... 

    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.cookieSession()); // Express cookie session middleware 
    app.use(passport.initialize()); // passport initialize middleware 
    app.use(passport.session());  // passport session middleware 

    // more code ... 

}); 
+51

此支持設置代碼並不表示用戶最終如何從會話中獲取。 – 2014-09-15 15:10:32

38

遲到了,但發現這個沒有答案谷歌搜索自己的答案後。

請求內部將是您可以使用的req.user對象。

路線如下所示:

app.get('/api/portfolio', passport.authenticate('jwt', { session: false }), stocks.buy); 

控制器是這樣的:

buy: function(req, res) { 
     console.log(req.body); 
     //res.json({lel: req.user._id}); 
     res.json({lel: req.user}); 
    } 
+5

這應該是正確的答案,因爲它解決了更直接的問題......在無狀態的REST API的情況下,這是要去... – 2016-02-08 20:18:23

+1

如果在登錄req.user後顯示爲未定義? – Aspen 2017-08-09 15:35:58

1

在參考Passport documentation,用戶對象包含在req.user。見下文。

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); 
    }); 

這樣,您就可以從您重定向到的頁面訪問您的用戶對象。

如果您遇到困難,您可以參考my Github project,我清楚地實現了它。

+0

這正是我正在尋找的!我從來沒有想過要在哪裏實際訪問req.user,並且完美地總結了它。謝謝! – Rahul 2017-08-11 15:21:04