Passport - 用户未存储在会话中

时间:2016-12-14 17:12:03

标签: node.js session express passport.js

我是nodejs的新手,所以我试图建立一个身份验证系统。我按照教程后实现了它。 要在进行身份验证时获取用户对象,您需要将其存储在会话中。我是通过配置express-session完成的,如下所示:

require('./config/passport')(passport); // pass passport for configuration

app.use(session({
    secret: 'thisisagreatgreatsecretforthesession',
    resave: true,
    saveUninitialized: true
}));

app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended : false }));
app.use(bodyParser.json());

app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.use(function(req, res, next) {
  res.locals.user = req.user;
  next();
});


var routes = require('./app/routes')(app, passport);

然后在护照中我配置了序列化和反序列化函数,如下所示:

passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });

我尝试在deserializeUser功能中安装用户,这是正确的。但是,当我在模板中调用user时,出现错误,指出用户未定义。

我在配置中遗漏了其他内容吗?

1 个答案:

答案 0 :(得分:0)

默认情况下,会话属性不会公开给模板。

如果您想从模板中访问req.user,可以使用一个简单的Express中间件来公开它:

app.use(function(req, res, next) {
  res.locals.user = req.user;
  next();
});

(确保在 session和Passport中间件之后添加此中间件,但之前添加了呈现访问user的模板的任何路由 ;使用Express,您声明中间件的顺序很重要)

这使用res.locals作为向所有模板公开数据的方法。实际上,如果你查看Express文档,它几乎显示了与如何公开用户数据的示例完全相同的代码。