如何使用 Express 跨端口/域共享 cookie

tez*_*tez 5 javascript cookies node.js express

我有两个 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()
}))
Run Code Online (Sandbox Code Playgroud)

另一个应用程序(在端口上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 })
}))
Run Code Online (Sandbox Code Playgroud)

它们都使用相同的会话配置对象(唯一的区别是一个存储在 MongoDB 中,而另一个存储在内存中。

我像这样设置了一个cookie localhost:3000

res.cookie('mycookie', 'bar', { domain: 'localhost:4000' })
Run Code Online (Sandbox Code Playgroud)

然后我 POST(使用 jquery.ajax)到 上的路由localhost:4000,并且 cookiemycookie不存在。

注意:我设置了 CORSlocalhost:4000以接受 origin localhost:3000,当我使用 Jquery 发布时,我使用xhrFields: { withCredentials: true }.

所以我的问题是,如何正确配置应用程序以相互设置 cookie?:)

Mih*_*scu 3

我建议您在两个应用程序之间共享会话存储。

编辑:只是为了澄清您不能将 cookie 从一个域设置到另一个域。因此,domainA无法为domainB设置cookie - 您必须让domainB设置cookie(例如,通过访问domainB)。使用您当前的配置,您应该能够按预期读取 cookie。

最初,我认为您想通过 cookie 在两个应用程序之间共享状态,这就是为什么我建议在应用程序之间共享会话存储。