如何在 Express 中跨端口/域共享 cookie

8

我有两个运行在不同端口上的Node.js(Express)应用程序。其中一个运行在localhost:3000,另一个运行在localhost:4000。端口3000上的应用程序具有以下cookie配置:

app.use(express.cookieParser())

app.use(express.session({
    key: settings.session.key,
    secret: settings.session.secret,
    cookie: settings.session.cookie,
    fingerprint: function () { return '' },
    store: new MemoryStore()
}))

另一个应用(位于端口4000)具有以下功能:

app.use(express.cookieParser())

app.use(express.session({
    key: settings.session.key,
    secret: settings.session.secret,
    cookie: settings.session.cookie,
    fingerprint: function() { return ''  },
    store: new MongoSessionStore({ db: db })
}))

他们都使用相同的会话配置对象(唯一的区别是一个存储在MongoDB中,而另一个存储在内存中)。
我在localhost:3000上设置了一个cookie:
res.cookie('mycookie', 'bar', { domain: 'localhost:4000' })

我使用jquery.ajax向localhost:4000的一个路由发送POST请求,但cookie mycookie未出现。请注意:我已在localhost:4000上设置了CORS以接受源localhost:3000,并且当我使用Jquery进行post时,我使用xhrFields: { withCredentials: true }。所以我的问题是,如何正确配置应用程序以相互设置cookie呢? :)

如果您为两个站点使用相同的Mongo会话存储,会发生什么? - Josh C.
@JoshC。这会导致两个应用程序之间的共享会话。 - tez
1个回答

3
我建议您在两个应用程序之间共享会话存储。
编辑:为了澄清,您不能从一个域设置cookie到另一个域。因此domainA无法为domainB设置cookie - 您必须让domainB设置cookie(例如通过访问domainB)。 使用您当前的配置,您应该能够按预期读取cookie。
最初,我认为您想要通过cookie共享两个应用程序之间的状态,这就是为什么我建议在应用程序之间共享会话存储的原因。

你其实可以。但如果你正在使用 httpOnly 呢? - Chukwuemeka Maduekwe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接