我有一个在 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:4000
和api.app.com:4000
或something.app.com:4000
下的cookie。
注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/