【问题标题】:Passport - user is not stored in sessionPassport - 用户未存储在会话中
【发布时间】:2017-04-30 02:58:35
【问题描述】:

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

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

【问题讨论】:

    标签: node.js session express passport.js


    【解决方案1】:

    默认情况下会话属性不暴露给模板。

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

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

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

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

    【讨论】:

    • 我现在没有收到任何错误,但是当我使用user 时,模板中仍然没有显示任何内容。到目前为止配置的顺序是否正确?
    • 如果您没有收到任何错误,模板可以访问user。您可以在中间件中添加 console.log(req.user) 以确保它实际上具有值(它很可能是一个对象,您必须从中使用模板中的属性,例如 user.username 或类似的东西)。
    • console.log(req.user) 工作正常,但在模板中当我使用<% user.name %> 时,我什么也得不到
    • @omarsafwany 假设您使用的是 EJS 模板,那应该是 <%= user.name %>
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2011-03-13
    相关资源
    最近更新 更多