【问题标题】:Sharing Express Session Across Sub Domains跨子域共享 Express Session
【发布时间】:2020-01-04 18:56:44
【问题描述】:

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

  1. www.domain.com (WEB)
  2. app.domain.com (APP)

我正在尝试在两个应用程序上调用相同的登录会话,我的代码在我的本地机器上运行良好(可能是因为它相同的主机名和端口不会中断会话并将其计为新会话)

当我尝试将我的代码推送到生产环境时,它根本不起作用,网络会话无法识别 APP 设置的会话

APP 是设置会话的地方(它处理登录)。

下面的 session 和 cors 代码用于 web 和 app

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
        })
    })
);

一旦用户从 APP 登录,我希望通过 WEB 包维护和调用该会话。这样我也可以动态改变网站体验。

解决方案

@theusguy 关于添加域参数是正确的。还有很多问题需要解决

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

location / {
proxy_pass http://127.0.0.1:3021;
proxy_http_version 1.1; //this was missing
proxy_set_header Upgrade $http_upgrade; //this was missing
proxy_set_header Connection 'upgrade'; //this was missing
proxy_set_header Host $host; //this was missing
proxy_cache_bypass $http_upgrade; //this was missing
}

继续前进,您的 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');

最后

我必须清除我的 cookie 以删除任何误报 ^ 这是最烦人的一步

【问题讨论】:

    标签: node.js express session passport.js express-session


    【解决方案1】:

    这可能是由于在子域级别设置了 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
            })
        })
    );
    

    【讨论】:

    • 这样做了,现在登录不起作用。如果你知道为什么让我知道 - 会深入研究这个登录错误,看看我是否能找到根本原因
    • 我尝试挖掘并且域参数破坏了我的护照身份验证。没有错误,也没有身份验证过程。不知道为什么
    • 你在本地测试这个吗?为 localwww.domain.com 和 localapp.domain.com 之类的本地名称创建一个主机名。更多信息在这里。 stackoverflow.com/questions/9071969/…
    • 我为不同的环境模式创建了单独的会话初始化,并在上面提供了一个解决方案:)
    • 是的,事情解决了,没有真正的教程可以如此清楚地解释这个问题 - 我可能会做一个
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2011-11-27
    • 2018-05-04
    • 2013-09-15
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多