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

时间:2017-08-17 08:07:09

标签: node.js session express passport.js

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

  1. http://localhost:3000

  2. http://localhost:3001

  3. 我使用express.js和passport.js进行身份验证。验证工作正常,但是如果:

    1. 我在服务器1上登录
    2. 我在服务器2上登录
    3. 然后服务器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);
      });
      

1 个答案:

答案 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}}了解详情。

  

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