会话在两个本地Node.js服务器上

我有两个本地的Node.js服务器:

  1. HTTP://本地主机:3000

  2. HTTP://本地主机:3001

我使用express.js和passport.js进行身份validation。 validation工作正确,但是如果:

  1. 我在服务器1上login
  2. 我在服务器2上login

那么服务器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); }); 

我假设你正在为你的两个应用程序使用相同的数据库。

默认情况下,不能将同一主机名的不同应用的会话保存在同一数据库中。 您必须通过使用不同的名称或前缀来区分它们。

如果您使用express-session处理会话,则可以通过选项设置不同的名称:

 app.use(session({ secret: '12345', resave: true, saveUninitialized: true, name: 'app1' // use a different name for the second app })); 

阅读express-session的官方文件了解更多信息。

注意
如果您有多个应用程序运行在相同的主机名(这只是名称,即localhost127.0.0.1 ;不同的scheme和端口不会命名一个不同的主机名),那么您需要将会话cookie彼此分开。 最简单的方法是简单地为每个应用程序设置不同的names