在域和子域之间共享会话



我现在有点困了。我花了三天的大部分时间来解决这个小问题,我希望这只是一个简单的错误。

手头的问题是我不能得到会话在example.com和b.example.com之间共享。我正在使用AWS,目前使用SSL。我必须尝试所有的解决方案,人们说,将解决问题,从使用CORS,领导一个'域。(相信这已经过时了,现在不需要了),以及我能在网上读到的任何东西。这让我相信这是我的一些其他代码,所以我把它全部注释掉了,遗憾的是仍然不能让它工作。我通过在某些中间件中打印出SessionID并访问子域和域,然后检查日志来测试会话是否共享。对于我在vhost上"托管"它的子域,我将在下面发布我的代码。谢谢你提前,如果你需要任何其他信息,我会尽量尽快发布。

主要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);

子域vhost文件

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;

如果它应该工作,因为它是我将尝试做更多的测试,当我回到家,张贴我发现如果有。再次感谢你!

编辑:似乎每次我刷新子域时,vhost都会创建一个新的会话。我移到了表达式子域。当我这样做时,一个cookie出现在子域上,而在vhost上没有。子域和主域之间的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,但我删除了它们,它仍然有效。希望这有助于如果你有同样的问题!

相关内容

  • 没有找到相关文章

最新更新