我有两个本地 Node.js 服务器:
我使用express.js和passport.js进行身份验证。身份验证工作正常,但是如果:
- 我登录服务器 1
- 我登录服务器 2
然后服务器 1 上的 session 消失。如何防止这种情况发生?
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);
});
最佳答案
我假设您的两个应用程序使用相同的数据库。
默认情况下,您无法将具有相同主机名的不同应用的 session 保存在同一数据库上。您必须通过使用不同的名称或前缀来区分它们。
如果您使用 express-session
来处理 session ,您可以通过选项设置不同的名称:
app.use(session({
secret: '12345',
resave: true,
saveUninitialized: true,
name: 'app1' // use a different name for the second app
}));
阅读official documentation express-session
了解更多信息。
Note
if you have multiple apps running on the same hostname (this is just the name, i.e.localhost
or127.0.0.1
; different schemes and ports do not name a different hostname), then you need to separate the session cookies from each other. The simplest method is to simply set differentnames
per app.
关于node.js - 两个本地 Node.js 服务器上的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729698/