node.js - 如何从express/node应用程序在 ".localhost"上设置cookie,以便可以从 "something.localhost"访问它

标签 node.js express

我有一个在 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);

提前致谢...

最佳答案

您可以为子域设置cookie。

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

因此,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 点击相应的 api(服务器在端口 4001 上运行)

但是现在,存储的 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,该域由根域app.com下的所有网络应用程序共享,例如:检查app.com:4000api.app.com:4000something.app.com:4000下的cookie。

enter image description here enter image description here

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

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

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

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

关于node.js - 如何从express/node应用程序在 ".localhost"上设置cookie,以便可以从 "something.localhost"访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847914/

相关文章:

javascript - 有没有更短的方法来合并重复的对象

arrays - NodeJS/MongoDB - 将数组中的值与登录用户的值进行匹配

node.js - Cradle/Express/EJS 将 html 转换为其实体

node.js - 如何在 Node Express.js 中使用 cookie-session

javascript - 无法使用 NodeJS 登录生成 jwt token

javascript - 未在 req.body Express/node.js 中获取表单数据

javascript - 为什么我的fs错误在Node.js中返回空对象?

javascript - 将两个对象数组合并在一起 es6

javascript - Socket.io 发送给房间里的每个人,除了发送者

node.js - 使用 Node JS 和 Mongoose 进行分页从 MongoDB 检索数据