登录一个Express应用程序会破坏另一个(同一服务器)中的会话



我有两个独立的Express4.x应用程序在同一台服务器机器上运行(不同的端口),共享一个MongoDB实例。它们都使用不同的数据库,并且具有不同的会话机密。

我可以单独登录应用程序A或B而不会出现问题。我的会议维持了下来,一切都很好。但是,如果我登录到A,然后再登录到B,我在A中的会话将被破坏(反之亦然)。

两个应用程序具有几乎相同的本地身份验证。他们的serializeUserdeserializeUser非常原始(几乎完全遵循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运行-

在默认情况下同时运行这些项目时,它们将具有相同的会话名称,因此它们在身份验证中会发生冲突。因此,您必须为每个项目使用不同的会话名称。

相关内容

最新更新