Node.js 跨子域共享Express会话
我有两个应用程序,WEB和应用程序,它们托管在不同的端口(本地)和不同的域(公开)上。例如: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
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
})
})
);