我有一个运行在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);
预先感谢...
答案 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
。
注释1:
确保第一次执行 ACTION (通过在浏览器中打开something.app.com:4000
进行检查),清除与域api.app.com
对应的所有cookie,否则,根据您服务器的实现,如果cookie已经存在,则可能不会重新设置它。
注释2
由于api.app.com:4000
向app.com
发出了HTTP请求,因此请确保正确设置CORS标头,例如:
api.app.com
使用express cors middleware可以轻松地将多个子域/域列入白名单。