【发布时间】:2017-10-30 13:10:49
【问题描述】:
我正在尝试在我的 nodejs 应用程序中通过 express4 使用 passportjs。出于测试目的,我使用 session-file-store 来保持会话。
我设置会话和护照的方式:
this.app.use(session({
secret: process.env.SESSION_SECRET || configuration.session_secret,
store: new fileStore(),
resave: false,
saveUninitialized: false
}));
// config authentication
this.app.use(passport.initialize());
this.app.use(passport.session());
// Configure Passport
passport.use('local-login', new localStrategy.Strategy(
(username, password, done) => {
Services.users.authenticatePromise(username, password).then(
function(token) {
done(null, token);
},
function(err) {
done(null, false, err);
},
).done();
},
));
// Serialize user in session
passport.serializeUser((token: AccessToken, done) => {
let user = {
_token: token.accessToken,
_expiryInAt: token.expiryInMs + new Date().getTime(),
};
done(null, user);
});
passport.deserializeUser((sessionUser, done) => {
done(null, sessionUser);
});
但是,我遇到的问题是,如果在用户登录之前我没有在会话中写入任何内容,则 passportjs 可以正常工作。但是,如果我尝试将一些数据写入会话中,例如购物车详细信息,那么 passportjs 将无法再将用户令牌序列化到会话存储中。所以登录不能成功。
我错过了什么?
【问题讨论】:
-
你在做
req.session = { ... }或类似的事情吗? IE。用新的东西覆盖整个会话对象。 -
不,我做了类似的事情:
if (!req.session['basket']) { req.session['basket'] = {}; } -
抱歉,这应该不是问题,因为它无法序列化。您可以将
passport.serializeUser/deserializeUser的实现添加到您的问题中吗?另外,“无法序列化”究竟是什么意思? -
序列化和反序列化函数在哪里。也在这里写他们的代码
-
另外,“不能序列化”到底是什么意思?我的意思是,如果我检查了会话文件,则根本没有写入护照会话。
标签: node.js express passport.js