我已经用本地护照和 MongoDB 实现了 Passport,它运行良好。
然而,这是一个纯粹的客户端单加载应用程序,因此节点不负责 html 的呈现。所以目前我在应用程序加载时显示了一个加载微调器,并单独调用一个 api 以确定用户是否登录以有条件地呈现一些东西:
router.get('/me', function (req, res) {
res.send(req.isAuthenticated() ? {} || 401);
});
由于护照已经验证了我的路线并调用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
中间件内部登录?