护照 - 用户未存储在会话中

Passport - user is not stored in session

我是 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 中我配置了序列化和反序列化函数如下:

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 时,我收到一条错误消息,指出未定义用户。

我是否遗漏了配置中的其他内容?

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

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

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

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

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