在域和子域之间共享会话
Sharing sessions between domain and subdomain
我现在有点卡住了。花了 3 天的大部分时间试图找出这个小问题,我希望这只是一个简单的错误。
手头的问题是我无法在 example.com 和 b.example.com 之间共享会话。我正在使用 AWS,目前正在使用 SSL。我必须尝试所有人们认为可以解决问题的解决方案,从使用 CORS,以“.”引导域(相信这已经过时,现在不需要)到我可以在线阅读的任何其他内容。这让我相信这是我的一些其他代码,所以我把它全部注释掉了,遗憾的是仍然无法让它工作。我通过在某些中间件中打印出 SessionID 并访问子域和域然后检查日志来测试会话是否共享。对于子域,我 'host' 它在 vhost 上,我将 post 我的代码如下。
在此先感谢您,如果您需要任何其他信息,我会尽快 post 提供。
主要app.js
var express = require('express');
var app = express();
var vhost = require('vhost');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var helmet = require('helmet');
var flash = require('req-flash');
var cors = require('cors');
var session = require('express-session');
var favicon = require('serve-favicon');
var MongoStore = require('connect-mongo')(session);
var middlewares = require("./app/middlewares/middleware.js");
var controllerLogic = require('./app/controllers/logic/controllerLogic.js');
//app.set('views', express.static(__dirname + '/views'));
app.set('view engine', 'ejs');
app.set('trust proxy', 1);
mongoose.connect(process.env.MONGOOSE_CONNECT);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("MONGODB connected");
});
app.use(helmet());
app.use(favicon('./public/img/favicon.png'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static(__dirname + '/public'));
app.use(session({
name: 'exampleSession',
genid: function(req) {
return require('crypto').randomBytes(48).toString('hex');
},
rolling: true,
secret: process.env.COOKIE_SESS_SECRET,
resave: false,
saveUninitialized: false,
domain: 'example.co',
cookie: {
test: 'help',
secure: true,
maxAge: 270000,
httpOnly: true //http://expressjs.com/en/advanced/best-practice-security.html
},
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
app.use(middlewares.prettifyDomain);
app.use(flash());
app.use(controllerLogic.flashAll);
app.use(vhost('b.example.co', require('./libs/vhost/b.app.js').app));
app.get('/ping', function (req, res) {
res.send('successfuly pinged(kinda)!');
});
require('./app/controllers/routes/boards.js')(app);
require('./app/controllers/routes/user.js')(app);
require('./app/controllers/routes/main.js')(app);
app.listen(process.env.PORT || 80);
子域虚拟主机文件
var express = require('express');
var app = express();
var router = express.Router();
var middlewares = require("./../../app/middlewares/middleware.js");
require('./../../app/controllers/router/routes.js')(router);
app.use(router);
exports.app = app;
如果它应该 正常工作,我会在回家后尝试做更多的测试,post 我发现了什么(如果有的话)。再次感谢!
编辑:每次我在子域上刷新时,虚拟主机似乎都会创建一个新会话。我搬到了 express-subdomain。当我这样做时,一个 cookie 出现在子域上,而虚拟主机上有 none。子域和主域之间的 SessionId 仍然不同,但现在子域每个请求都没有新的 SessionID。变化看起来像这样...
app.use(subdomain('b', router));
require('./app/controllers/router/routes.js')(router);
//above replaced the code below.
//require('./libs/vhost/b.app.js').app;
//app.use(vhost('b.example.co', require('./libs/vhost/b.app.js').app));
解决了我的问题,这很可能是因为我希望快速查看人们发布的其他解决方案。
问题是我的域在 cookie 之外,所以它不会转到我的域到子域。一旦我输入
domain: 'example.co',
里面
cookie: {
}
它解决了这个问题。另请注意,我认为我需要使用 cors 但我删除了它们并且它仍然有效。如果您遇到同样的问题,希望这对您有所帮助!
我现在有点卡住了。花了 3 天的大部分时间试图找出这个小问题,我希望这只是一个简单的错误。
手头的问题是我无法在 example.com 和 b.example.com 之间共享会话。我正在使用 AWS,目前正在使用 SSL。我必须尝试所有人们认为可以解决问题的解决方案,从使用 CORS,以“.”引导域(相信这已经过时,现在不需要)到我可以在线阅读的任何其他内容。这让我相信这是我的一些其他代码,所以我把它全部注释掉了,遗憾的是仍然无法让它工作。我通过在某些中间件中打印出 SessionID 并访问子域和域然后检查日志来测试会话是否共享。对于子域,我 'host' 它在 vhost 上,我将 post 我的代码如下。 在此先感谢您,如果您需要任何其他信息,我会尽快 post 提供。
主要app.js
var express = require('express');
var app = express();
var vhost = require('vhost');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var helmet = require('helmet');
var flash = require('req-flash');
var cors = require('cors');
var session = require('express-session');
var favicon = require('serve-favicon');
var MongoStore = require('connect-mongo')(session);
var middlewares = require("./app/middlewares/middleware.js");
var controllerLogic = require('./app/controllers/logic/controllerLogic.js');
//app.set('views', express.static(__dirname + '/views'));
app.set('view engine', 'ejs');
app.set('trust proxy', 1);
mongoose.connect(process.env.MONGOOSE_CONNECT);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("MONGODB connected");
});
app.use(helmet());
app.use(favicon('./public/img/favicon.png'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static(__dirname + '/public'));
app.use(session({
name: 'exampleSession',
genid: function(req) {
return require('crypto').randomBytes(48).toString('hex');
},
rolling: true,
secret: process.env.COOKIE_SESS_SECRET,
resave: false,
saveUninitialized: false,
domain: 'example.co',
cookie: {
test: 'help',
secure: true,
maxAge: 270000,
httpOnly: true //http://expressjs.com/en/advanced/best-practice-security.html
},
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
app.use(middlewares.prettifyDomain);
app.use(flash());
app.use(controllerLogic.flashAll);
app.use(vhost('b.example.co', require('./libs/vhost/b.app.js').app));
app.get('/ping', function (req, res) {
res.send('successfuly pinged(kinda)!');
});
require('./app/controllers/routes/boards.js')(app);
require('./app/controllers/routes/user.js')(app);
require('./app/controllers/routes/main.js')(app);
app.listen(process.env.PORT || 80);
子域虚拟主机文件
var express = require('express');
var app = express();
var router = express.Router();
var middlewares = require("./../../app/middlewares/middleware.js");
require('./../../app/controllers/router/routes.js')(router);
app.use(router);
exports.app = app;
如果它应该 正常工作,我会在回家后尝试做更多的测试,post 我发现了什么(如果有的话)。再次感谢!
编辑:每次我在子域上刷新时,虚拟主机似乎都会创建一个新会话。我搬到了 express-subdomain。当我这样做时,一个 cookie 出现在子域上,而虚拟主机上有 none。子域和主域之间的 SessionId 仍然不同,但现在子域每个请求都没有新的 SessionID。变化看起来像这样...
app.use(subdomain('b', router));
require('./app/controllers/router/routes.js')(router);
//above replaced the code below.
//require('./libs/vhost/b.app.js').app;
//app.use(vhost('b.example.co', require('./libs/vhost/b.app.js').app));
解决了我的问题,这很可能是因为我希望快速查看人们发布的其他解决方案。
问题是我的域在 cookie 之外,所以它不会转到我的域到子域。一旦我输入
domain: 'example.co',
里面
cookie: {
}
它解决了这个问题。另请注意,我认为我需要使用 cors 但我删除了它们并且它仍然有效。如果您遇到同样的问题,希望这对您有所帮助!