Как я могу использовать куки-файлы с сайтом, где вызовы HTML и API имеют разные домены? - PullRequest
0 голосов
/ 05 апреля 2020

Я размещаю веб-сайт одностраничного приложения на stati c сервере (например, Amazon S3), поэтому он обслуживается через URL-адрес моего приложения, скажем, "example.com". Таким образом, сайт живет на уровне "https://example.com". Этот сайт использует вызовы API, сделанные с помощью вызова JavaScript fetch () для выполнения функций сайта. Поскольку example.com указывает на сервер * stati c, API вызывает go для другого домена, давайте назовем его «xyz.execute-api.cloudhost.com» (это происходит за API-шлюзом Amazon).

Я хочу использовать куки для управления сеансом пользователя. То есть я хочу, чтобы один вызов API возвращал заголовок Set-Cook ie в ответе, который будет хранить cook ie в браузере, и я хочу, чтобы некоторые другие вызовы API передавали заголовок Cook ie в запросе. который затем может быть проверен в API. Повар ie всегда будет поступать из API и возвращаться в API (НЕ на сайт страницы, поскольку сама страница размещена на сервере c). Я хочу, чтобы повар ie сохранялся между сессиями (с некоторым сроком действия и пониманием того, что браузер может очистить его из-за нехватки места или действий пользователя).

Но это трудно сделать. Прежде всего, все мои вызовы API относятся к отдельному домену, поэтому я должен использовать CORS для авторизации вызовов. Когда я использую CORS, сервер должен включить «Cook ie» в список для Access-Control-Allow-Headers, иначе он не будет возвращен. Кроме того, когда я использую API Javascript fetch () для выполнения вызова, мне нужно указать, чтобы включить учетные данные, например:

fetch(url, {method: "POST", credentials: "include"})

... или повар ie не будет отправлено. Вызов API, который ВОЗВРАЩАЕТ куки, не должен получать куки, но я также должен указать credentials: "include", иначе браузер проигнорирует этот заголовок ответа Set-Cook ie.

Мне также нужно правильно настроить самого повара ie. Различные вызовы API имеют разные пути, поэтому мне нужно указать Path=/ в моем заголовке Set-Cook ie. Я бы предпочел установить SameSite=Strict, Secure, HttpOnly и значение для Max-Age, но я готов проявить гибкость, если это необходимо.

И это насколько я получил. Я до сих пор не могу разместить свои куки (с помощью Set-Cook ie) и вернуть их на сервер (в Cook ie) кросс-платформенным способом. Поскольку домен страницы не совпадает с доменом API, мне может потребоваться указать SameSite=None, но если я это сделаю, недавние изменения стандартов могут потребовать от меня также установить Secure (что отлично). Несмотря на это, я не могу заставить все основные браузеры вернуть повара ie. Я также ожидал, что установка нового повара ie с тем же ключом заменит существующий, но я также не могу заставить его работать - когда он возвращается, я вижу оба куки.

Что такое правильный способ использования файлов cookie в этой ситуации?

1 Ответ

1 голос
/ 07 апреля 2020

Поскольку вы прямо говорите, что хотели бы инициировать эти запросы с отдельного сайта на сайт API, это означает, что они по своей сути будут межсайтовыми или сторонними запросами и, следовательно, файлы cookie должны быть помечены как SameSite=None; Secure.

Если вы хотите использовать что-то вроде SameSite=Strict или SameSite=Lax, вам нужно будет вместо этого управлять поваром ie из SPA. Это может быть предпочтительнее, так как это позволит вам сохранить идентификатор сеанса или токен там, а затем передать это как отдельное поле или заголовок в ваш API. Таким образом, ваш API не зависит от файлов cookie, что, вероятно, предпочтительнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...