会话在两个本地Node.js服务器上
我有两个本地的Node.js服务器:
-
HTTP://本地主机:3000
-
HTTP://本地主机:3001
我使用express.js和passport.js进行身份validation。 validation工作正确,但是如果:
- 我在服务器1上login
- 我在服务器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
的官方文件了解更多信息。
注意
如果您有多个应用程序运行在相同的主机名(这只是名称,即localhost
或127.0.0.1
;不同的scheme和端口不会命名一个不同的主机名),那么您需要将会话cookie彼此分开。 最简单的方法是简单地为每个应用程序设置不同的names
。