Браузер не отправляет повара ie с домена с перенаправлением www after - PullRequest
1 голос
/ 07 апреля 2020

У меня есть промежуточная версия для моего сайта 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;
}

1 Ответ

3 голосов
/ 16 апреля 2020

Я полагаю, что вы неправильно интерпретируете документацию MDN .

Если не указано, по умолчанию используется хост текущего местоположения документа, , исключая субдомены .

Значение, если вы используете beta.example.com, тогда Domain будет установлено в значение beta.example.com. Это исключит повара ie из других поддоменов.

Вы должны явно установить Domain, если хотите использовать повара ie на всех поддоменах.

...