Node.js 跨子域共享Express会话

Node.js 跨子域共享Express会话,node.js,express,session,passport.js,express-session,Node.js,Express,Session,Passport.js,Express Session,我有两个应用程序,WEB和应用程序,它们托管在不同的端口(本地)和不同的域(公开)上。例如: www.domain.com(网络) app.domain.com(应用程序) 我尝试在两个应用程序上调用相同的登录会话,我的代码在我的本地计算机上运行得很好(可能是因为相同的主机名和端口不会中断会话并将其计为新会话) 当我试图将代码推送到生产环境时,它根本不起作用,web会话无法识别应用程序设置的会话 应用程序是设置会话的地方(它处理登录) 下面的会话和cors代码用于web和应用程序 const c

我有两个应用程序,WEB和应用程序,它们托管在不同的端口(本地)和不同的域(公开)上。例如:

  • www.domain.com(网络)
  • app.domain.com(应用程序)
  • 我尝试在两个应用程序上调用相同的登录会话,我的代码在我的本地计算机上运行得很好(可能是因为相同的主机名和端口不会中断会话并将其计为新会话)

    当我试图将代码推送到生产环境时,它根本不起作用,web会话无法识别应用程序设置的会话

    应用程序是设置会话的地方(它处理登录)

    下面的会话和cors代码用于web和应用程序

    const cors = require('cors')
    app.use(cors());
    app.use(cookieParser());
    
    app.use(
        session({
            resave: true,
            saveUninitialized: true,
            secret: process.env.SESSION_SECRET,
            cookie: { maxAge: 1209600000 }, // two weeks in milliseconds
            store: new MongoStore({
                mongooseConnection: mongoose.connection,
                autoReconnect: true
            })
        })
    );
    
    一旦用户从应用程序登录,我希望该会话能够通过WEB软件包进行维护和调用。这样我也可以动态地改变网站体验

    解决方案

    @关于添加域参数,Usguy是对的。我面临着更多需要解决的问题

    主机 我的nginx配置不正确,因此主机名为127.0.0.1:3000 为了解决这个问题,我在conf中添加了以下配置

    接下来,app.js的流程非常重要

    应用程序

    var app = express();
    app.enable('trust proxy');
    // app.use(cors()); //APP does not need cors because its GENERATING the long lasting session that needs to be read everywhere
    //Everything else goes below this
    app.use(cookieParser());
    app.use(
        session({
            resave: false,
            saveUninitialized: false,
            secret: process.env.SESSION_SECRET,
            cookie: {
                domain: '.domain.com',
                maxAge: 1209600000 // two weeks in milliseconds
            },
            store: new MongoStore({
                mongooseConnection: mongoose.connection,
                autoReconnect: true
            })
        })
    );
    
    var mainRouter = require('./routes/main');
    
    网络

    var app = express();
    app.enable('trust proxy'); 
    app.use(cors()); // TO read the cookie being set from elsewhere
    var mainRouter = require('./routes/main');
    
    最后

    我必须清除我的cookies以消除任何错误否定
    ^这是最烦人的一步

    这可能是因为cookie设置在子域级别。app.domain.com(app)的会话cookie对www.domain.com(WEB)无效

    尝试更改代码以在域级别设置cookie,并查看这是否有效

    app.use(
        session({
            resave: true,
            saveUninitialized: true,
            secret: process.env.SESSION_SECRET,
            cookie: { maxAge: 1209600000, domain:'.domain.com' }, 
            store: new MongoStore({
                mongooseConnection: mongoose.connection,
                autoReconnect: true
            })
        })
    );
    

    这样做了,现在登录不起作用。如果你知道为什么lemme know-将深入研究这个登录错误,看看我是否能找到我试图深入的根本原因,域参数破坏了我的passport身份验证。没有错误,也没有身份验证过程。不确定你为什么在本地测试这个?为localwww.domain.com和localapp.domain.com等本地文件创建主机名。这里有更多的信息。我为不同的env模式创建了单独的会话初始化,并在上面提供了一个解决方案:)是的,事情已经解决了,没有真正的教程可以如此清楚地解释这个问题-我可能会制作一个
    app.use(
        session({
            resave: true,
            saveUninitialized: true,
            secret: process.env.SESSION_SECRET,
            cookie: { maxAge: 1209600000, domain:'.domain.com' }, 
            store: new MongoStore({
                mongooseConnection: mongoose.connection,
                autoReconnect: true
            })
        })
    );