如何在Express / Node应用程序的“ .localhost”上设置cookie,以便可以从“ something.localhost”访问它

时间:2019-04-25 11:09:46

标签: node.js express

我有一个运行在www.localhost:1234上的节点/快速应用程序。现在,我想从域“ .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);

预先感谢...

1 个答案:

答案 0 :(得分:0)

您可以为子域设置cookie。

当DNS解析树时,

子域是根域的子节点。要成为有效的根域,它应该由两部分组成,并用点分隔。

因此,即使something.localhost解析为与localhost相同的事物,something.localhost也不会使其成为localhost的子域。

解决方案/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

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

但是现在,存储的cookie将对应于域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,
}));

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

enter image description here enter image description here

注释1: 确保第一次执行 ACTION (通过在浏览器中打开something.app.com:4000进行检查),清除与域api.app.com对应的所有cookie,否则,根据您服务器的实现,如果cookie已经存在,则可能不会重新设置它。

注释2 由于api.app.com:4000app.com发出了HTTP请求,因此请确保正确设置CORS标头,例如:

api.app.com

使用express cors middleware可以轻松地将多个子域/域列入白名单。