首页 > 解决方案 > 如何从 express/node 应用程序在“.localhost”上设置 cookie,以便可以从“something.localhost”访问它

问题描述

我有一个在 www.localhost:1234 运行的 node/express 应用程序。现在我想在域“.localhost”中设置一个来自 express 的 httponly cookie。并希望在“something.localhost:1234”或“something.localhost:1234”等子域上访问它。我试过这样做但没有工作。

js

let options = {
  path:'/*',
  domain:'.localhost',
  httpOnly: true,
  maxAge: (1000 * 60 * 60 * 24)
};
res.cookie('cookieName', 'cookieValue', options);

提前致谢...

标签: node.jsexpress

解决方案


您可以为子域设置 cookie。

当 DNS 解析树时,子域是根域的子节点。要成为有效的根域,它应该有 2 个由点分隔的部分。

因此,即使something.localhost解析为与.localhostsomething.localhostlocalhost

解决方案,/etc/hosts.

127.0.0.1 app.com ## <- Becomes root domain
127.0.0.1 api.app.com
127.0.0.1 something.app.com

操作:现在,使用加载您的 Web 应用程序app.com:4000并使用相应的 api api.app.com:4001/users(服务器在端口 4001 上运行)

但是现在,存储的 cookie 将对应于 domain api.app.com。要解决此问题,您需要将 cookie 中的域设置为app.com(无论您的根域是什么)。

解决方案:

我正在使用express-session 1.16.2,我的配置看起来像

app.use(session({
  secret: 'some-key',
  name: '_somecookie',
  resave: false,
  saveUninitialized: true,
  cookie: { domain: 'app.com', secure: false }, // <- THIS, set domain as 'app.com'
  store: myRedisStore,
}));

现在再次执行您的操作。您应该会看到一个与域对应的 cookie,该 cookie由根域.app.com下的所有 Web 应用程序共享,例如:检查和或下的 cookie 。 app.comapp.com:4000api.app.com:4000something.app.com:4000

在此处输入图像描述 在此处输入图像描述

注意 1:api.app.com确保 在执行ACTION 1st 时 清除与域对应的任何 cookie (通过api.app.com:4000在浏览器中打开检查),否则,根据您的服务器实施,如果 cookie 已经存在,您可能不会重新设置它。

注 2 由于app.com是向 发出 http 请求api.app.com,请确保正确设置 CORS 标头,例如:

res.header("Access-Control-Allow-Origin", 'http://app.com:4000');

使用express cors 中间件轻松将多个子域/域列入白名单。


推荐阅读