护照 - 用户未存储在会话中
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 文档,它几乎显示了与如何公开用户数据的示例完全相同的代码。
我是 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 文档,它几乎显示了与如何公开用户数据的示例完全相同的代码。