【发布时间】:2020-07-19 20:28:12
【问题描述】:
我的网站有一个临时版本,它是beta.example.com。我最近使用以下设置添加了 cookie 身份验证:
response.cookie(tokenName, token, {
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000))
})
在暂存身份验证工作中。
当我将代码部署到生产环境时,cookie 已成功设置(通过 Set-Cookie 标头),但未在服务器端请求中发送到服务器。因此,当我刷新登录状态时,它会消失,但会保留在客户端请求中。
值得注意的是,有一个从example.com 到www.example.com 的301 重定向。 host 标头在生产中也是 www.example.com。
我最终通过在设置cookie时添加domain参数解决了这个问题,如下所示:
response.cookie(tokenName, token, {
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000)),
domain: '.example.com'
})
但是我并不完全理解问题的根源。根据MDN
域指定允许的主机接收 cookie。如果未指定,则默认为当前文档位置的主机,不包括子域。如果指定了域,则始终包含子域。
因此,当我在没有明确设置 domain 的情况下使用 beta.example.com 进行暂存时,根据 MDN,隐式 domain 将是 example.com,而 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;
}
【问题讨论】:
标签: authentication nginx redirect cookies http-status-code-301