2013-02-19 48 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