我已经实现了Passport与Passport -local和MongoDB,它工作得很好。
然而,这是一个纯客户端单加载应用程序,所以node不负责渲染html。所以目前我在app load上显示一个正在加载的旋转器并单独调用api来确定用户是否登录并有条件地渲染一些东西:
router.get('/me', function (req, res) {
res.send(req.isAuthenticated() ? {} || 401);
});
由于passport已经验证了我的路由和呼叫deserializeUser
,这似乎毫无意义-我需要一种方法来传递额外的信息(在cookie中?),说明用户已被授权,我猜在deserializeUser
?
server.use(session({secret: settings.sessionSecret}));
server.use(passport.initialize());
server.use(passport.session());
....
passport.use(new LocalStrategy(
localOpts,
function(email, password, done) {
User.findOne({
email: email,
activated: true
}, function (err, user) {
....
});
}
));
passport.serializeUser(function (user, done) {
done(null, user._id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
请注意,登录成功时创建的两个cookie:
express:sess
express:sess.sig
当它检测到这些cookie的存在时,它似乎只是调用deserializeUser
,因此为什么我认为我可以与客户端通信,用户在那里被授权,或者在passport.use
中间件内部登录?
事实证明,我可以简单地在passport.session之后添加一个中间件。我担心req.isAuthenticated
会向db发起另一个查询,但它没有:
server.use(function(req, res, next) {
res.cookie('isAuthenticated', req.isAuthenticated());
next();
});