我的网站有一个暂存版本beta.example.com
。我最近使用以下设置添加了cookie身份验证:
response.cookie(tokenName, token, {
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000))
})
在阶段身份验证有效。
当我将代码部署到生产环境时,已成功设置cookie(通过Set-Cookie
标头),但未在服务器端请求中将其发送到服务器。因此,当我刷新时,登录状态将消失,但会保留在客户端请求中。
值得注意的是,有一个从重定向example.com
到的301 www.example.com
。另外,host
头是www.example.com
在生产。
我最终通过domain
在设置cookie时添加参数来解决了这个问题,如下所示:
response.cookie(tokenName, token, {
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000)),
domain: '.example.com'
})
但是,我不完全了解问题的根源。根据MDN
域指定允许主机接收cookie。如果未指定,则默认为当前文档位置的主机,不包括子域。如果指定了域,则始终包含子域。
因此,当我在beta.example.com
未显式设置domain
的情况下进行隐式操作时,隐式domain
将example.com
根据MDN进行处理并被beta.example.com
排除在外。但是身份验证确实可以在分阶段进行!
但是我在生产中也有同样的情况,那www.example.com
为什么在生产中不起作用?
这是执行重定向的nginx配置:
server {
listen 80 default_server;
server_name beta.example.com;
location / {
include proxy_pass.inc;
}
}
server {
listen 80 default_server;
server_name www.example.com;
location / {
include proxy_pass.inc;
}
}
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
我相信您会误解MDN文档。
如果未指定,则默认为当前文档位置的主机,不包括subdomains。
如果你对含义beta.example.com
,然后Domain
将被设置为值beta.example.com
。这会将Cookie从其他子域中排除。
如果要Domain
在所有子域上使用cookie,则必须明确设置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句