Node.js Passport.js:身份验证后如何访问用户对象?
我正在使用Passport.js使用用户名和密码登录用户。我基本上使用的是Passport站点的示例代码。以下是我的代码的相关部分(我认为):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
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] %>