У меня есть промежуточная версия для моего сайта beta.example.com
. Недавно я добавил проверку подлинности с использованием следующих файлов:
response.cookie(tokenName, token, {
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000))
})
В процессе проверки подлинности работает.
Когда я развернул код для производства, повар ie был успешно установлен (через заголовок Set-Cookie
), но не был отправлен на сервер в запросах на стороне сервера. Поэтому, когда я перефразирую sh, зарегистрированное состояние исчезнет, но будет сохранено в клиентских запросах.
Стоит отметить, что существует перенаправление 301 с example.com
на www.example.com
. Кроме того, заголовок host
находился в рабочем состоянии www.example.com
.
Я в конечном итоге решил проблему, добавив параметр domain
при настройке повара ie следующим образом:
response.cookie(tokenName, token, {
httpOnly: true,
expires: new Date(Date.now() + (tokenExpirationSec * 1000)),
domain: '.example.com'
})
Однако Я не до конца понимаю источник проблемы. В соответствии с MDN
Домен определяет разрешенные хосты для получения повара ie. Если не указано, по умолчанию используется хост текущего местоположения документа, за исключением поддоменов. Если указан домен, то субдомены всегда включаются.
Так что, когда я был в стадии подготовки с 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;
}