我有两个本地Node.js服务器:
我使用express.js和passport.js进行身份验证。验证工作正常,但是如果:
然后服务器1上的会话消失。如何防止这种情况?
app.use(bodyParser());
app.use(cookieParser());
app.use(session({
secret: '12345',
resave: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(
function(username, password, done) {
users.getActiveByUsername(username, function(err, user) {
if (err) {console.log(err); return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username' });
}
if (user.password != password) {
return done(null, false, { message: 'Incorrect password' });
}
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});
app.post("/login", jsonParser, function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
if (!user) { res.status(400).send('Wrong username or password');return; }
req.logIn(user, function(err) {
if (err) { return next(err); }
return res.json({'success':'Successful login'});
});
})(req, res, next);
});
答案 0 :(得分:1)
我假设您为两个应用程序使用相同的数据库。
您无法在同一数据库默认情况下保存同一主机名的不同应用的会话。您必须使用不同的名称或前缀来区分它们。
如果您使用express-session
来处理会话,可以通过选项设置不同的名称:
app.use(session({
secret: '12345',
resave: true,
saveUninitialized: true,
name: 'app1' // use a different name for the second app
}));
阅读express-session
的{{3}}了解详情。
注意强>
如果你有多个应用程序在同一个主机名上运行(这只是名称,即localhost
或127.0.0.1
;不同的方案和端口没有命名不同的主机名,那么你需要分开会话cookie彼此。最简单的方法是简单地为每个应用设置不同的names
。