我的Node应用程序使用Express.js和Socket.io时出现问题,它们共享相同的会话ID。如果我在没有iframe或来源相同的iframe的情况下打开我的网站,它可以很好地工作(HTTP和Socket.io之间共享相同会话ID(。但是,Express.js和Socket.io之间的共享会话ID在不同来源(父和子(的iframe下运行时不起作用。在开发工具下,我没有看到cookie被设置到Chrome浏览器中。
两个来源都是非安全HTTP网站(例如。http://ip.ad.dr.ess/(父级(到http://ip.ad.dr.ess:6175/(儿童((。我直接访问我的网站,而不需要通过任何网络服务器,因为我用这个端口6175发布我的节点后端。
这是示例代码:
设置快速会话:
const sessionMiddleware = session({
resave: true,
saveUninitialized: true,
secret: config.session.secretKey,
httpOnly: true, // dont let browser javascript access cookie ever
ephemeral: true, // delete this cookie while browser close
cookie: { maxAge: config.session.maxAge, secure: false, sameSite: "none", path: "/" },
store: new (FileStore(session))({
logFn: logger.info,
reapInterval: config.session.reapInterval,
})
});
app.use(sessionMiddleware);
为Express.js:设置附加中间件
app.use(cors());
app.options('*', cors());
app.use(helmet({ frameguard: false }));
app.use(compression());
app.use(bodyParser.json());
app.use(cookieParser());
使用快速会话包设置Socket.io:
this.io = new Server(server, {
cors: {
origin: '*',
methods: ["GET", "POST", "PUT", "DELETE"],
},
});
this.socket.io.use((socket, next) => {
sessionMiddleware(socket.handshake, {}, next);
});
这个问题在Chrome浏览器中得到了修复,但在Safari中没有得到修复,因此您可能必须在URL上添加会话ID,然后在服务器上获取它。在Node服务器上,我只在express会话的cookie对象中设置了maxAge,并且两个来源都必须是安全的HTTPs网站才能使其工作。请按照此链接在Chrome浏览器中进行修复:https://serverfault.com/questions/1010706/setup-samesite-none-value-in-nginx-webserver