Node.js Passport.js:身份验证后如何访问用户对象?

Node.js Passport.js:身份验证后如何访问用户对象?,node.js,express,Node.js,Express,我正在使用Passport.js使用用户名和密码登录用户。我基本上使用的是Passport站点的示例代码。以下是我的代码的相关部分(我认为): app.use(passport.initialize()); app.use(passport.session()); passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done

我正在使用Passport.js使用用户名和密码登录用户。我基本上使用的是Passport站点的示例代码。以下是我的代码的相关部分(我认为):

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
});
app.get('/test',函数(req,res){
//如何在此处获取用户的登录信息?

console.log(req.user);//在注册passport中间件之前,您需要确保注册一个填充
req.session
的会话

例如,以下用途


迟到了,但在自己搜索答案后发现这个问题没有答案

请求内部将有一个
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});
    }
在参考中,用户对象包含在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);
     });
这样,您就可以从重定向到的页面访问用户对象


如果您被卡住了,您可以清楚地参考我在哪里实现它。

您可以这样定义您的路线,如下所示

router.post('/login',
passport.authenticate('local' , {failureRedirect:'/login', failureFlash: true}),
function(req, res) {
   res.redirect('/home?' + req.user.username);
});

在上面的代码片段中,您可以访问和传递用户对象的任何字段作为“req.user.field\u name”要重定向到的页面。这里需要注意的一点是,要重定向到的页面的基本url后面应该有一个问号。

我对javascript非常陌生,但我从教程中了解到,您必须首先实现一些会话
中间件
,如250R所示

const session=require('express-session')
const app=express()
use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
设sess={
genid:(请求)=>{
log('在会话中间件内')
console.log(请求sessionID)
返回uuid()
},
存储:新文件存储(),
机密:“键盘猫”,//来自环境的密码
resave:false,
滚动:是的,
saveUninitialized:true,
曲奇:{
HttpOnly:true,
最大值:30*60*1000//30分钟
}
}
应用程序使用(会话(sess))
//在使用express会话配置会话后调用passport
//当它骑在上面的时候
app.use(passport.initialize())
app.use(passport.session())
//然后您将能够在'req'对象上使用'user'属性
//包含所有会话详细信息
app.get('/test',函数(req,res){
控制台日志(请求用户)
})
接受可选参数,该参数是包含视图局部变量的对象

如果您使用并已验证了该用户,则包含该已验证用户

// app.js
app.get('/dashboard', (req, res) => {
  res.render('./dashboard', { user: req.user })
})

//index.ejs

派对迟到了,但这对我很有效

在app.js中使用此选项

app.use(function(req,res,next){
  res.locals.currentUser = req.user;
  next();
})
在客户端获取当前用户详细信息,如ejs

<%= locals.currentUser.[parameter like name || email] %>


此支持设置代码没有指明用户最终如何从会话中获取。这应该是正确的答案,因为它更直接地解决了问题…如果是无状态REST API,这就是问题所在…如果登录后req.user显示为未定义怎么办?嗯,我有这个问题,但仍然有问题,有什么想法吗?这是e这正是我要找的!我从来都不知道在哪里可以访问req.user,这是一个完美的总结。谢谢!passport文档链接已过期,请编辑您的答案更新!谢谢@Thecave3
app.use(function(req,res,next){
  res.locals.currentUser = req.user;
  next();
})
<%= locals.currentUser.[parameter like name || email] %>