我正在使用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
});
我已经检查了其他问题,但是我不确定我在这里做错了什么。谢谢!
答案 0 :(得分:53)
派对迟到但在我自己搜索答案后发现这个没有答案。
请求内部将是一个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});
}
答案 1 :(得分:5)
在引用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我清楚实施的地方。
答案 2 :(得分:2)
res.render
接受一个可选参数,该参数是一个包含视图局部变量的对象。
如果您使用passport并已通过身份验证,则req.user
包含经过身份验证的用户。
// app.js
app.get('/dashboard', (req, res) => {
res.render('./dashboard', { user: req.user })
})
// index.ejs
<%= user.name %>
答案 3 :(得分:0)
在注册护照中间件之前,您需要确保注册填充req.session
的{{3}}。
例如,以下使用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 ...
});
答案 4 :(得分:0)
您可以按照以下方式定义路线。
router.post('/login',
passport.authenticate('local' , {failureRedirect:'/login', failureFlash: true}),
function(req, res) {
res.redirect('/home?' + req.user.username);
});
在上面的代码片段中,您可以访问用户对象的任何字段并将其作为“ req.user.field_name”传递给您要重定向的页面。这里要注意的一件事是,您要重定向到的页面的基本URL后应带有问号。
答案 5 :(得分:0)
我对javascript还是很陌生,但是从教程中了解到,您必须先执行一些会话middleware
,如250R所示。
const session = require('express-session')
const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
let sess = {
genid: (req) => {
console.log('Inside the session middleware')
console.log(req.sessionID)
return uuid()
},
store: new FileStore(),
secret: 'keyboard cat', // password from environment
resave: false,
rolling: true,
saveUninitialized: true,
cookie: {
HttpOnly: true,
maxAge: 30 * 60 * 1000 // 30 minutes
}
}
app.use(session(sess))
// call passport after configuring the session with express-session
// as it rides on top of it
app.use(passport.initialize())
app.use(passport.session())
// then you will be able to use the 'user' property on the `req` object
// containing all your session details
app.get('/test', function (req, res) {
console.log(req.user)
})
答案 6 :(得分:0)
参加聚会,但这对我有用
在您的app.js中使用它
app.use(function(req,res,next){
res.locals.currentUser = req.user;
next();
})
在客户端(例如ejs)获取当前用户详细信息
<%= locals.currentUser.[parameter like name || email] %>