我有两个独立的Express4.x应用程序在同一台服务器机器上运行(不同的端口),共享一个MongoDB实例。它们都使用不同的数据库,并且具有不同的会话机密。
我可以单独登录应用程序A或B而不会出现问题。我的会议维持了下来,一切都很好。但是,如果我登录到A,然后再登录到B,我在A中的会话将被破坏(反之亦然)。
两个应用程序具有几乎相同的本地身份验证。他们的serializeUser
和deserializeUser
非常原始(几乎完全遵循Passport文档)。
似乎在登录A然后登录B时,req.session.passport
被破坏,导致req.user
无法在应用程序A上正确序列化,会话被认为无效。
我开始认为这与两个应用程序在同一台机器上运行(因此是域)有关,只是端口不同
express session:Node.js中用于express的简单会话中间件。要使用它,必须包含这样的包。
var session = require('express-session');
要安装此软件包,请运行以下命令:
$ npm install express-session
如何在Express中使用它,给出了以下代码:
app.use(session({
secret: 'secretkey',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
默认情况下,要在响应中设置(并从请求中读取)的会话ID cookie的名称为connect.sid
。要覆盖此项,请使用以下内容:
app.use(session({
name: 'cookiename',
secret: 'secretkey',
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));
有关更多参考,请参阅此链接-https://www.npmjs.com/package/express-session
注意:-将express-session
语句放在应用程序app.js中的app.use(passport.session())
语句之前。
希望这将有助于解决您的查询
const mongoose = require('mongoose'),
timestamps = require('mongoose-timestamp');
var Schema = mongoose.Schema;
const Sessions = new mongoose.Schema({
expires : {
type : String,
default : ""
},
session : {
type : Schema.Types.Mixed,
default : {}
}
}, { collection: 'sessions' })
Sessions.plugin(timestamps)
module.exports = mongoose.model('sessions', Sessions);
//require schema
const Sessions = require('sessions');
//remove session by id
Sessions.remove({"session.user._id":user._id}
).exec(console.log)
在不同的端口上运行时,必须提到不同项目中每个会话的不同名称。默认情况下,所有项目都将为connect.sid
。
例如:-项目A在端口3000中运行-
项目B在港口5000运行-
在默认情况下同时运行这些项目时,它们将具有相同的会话名称,因此它们在身份验证中会发生冲突。因此,您必须为每个项目使用不同的会话名称。