Вызов API аутентификации из другого домена не установит куки - PullRequest
0 голосов
/ 11 марта 2020

Я использую Flask API, который устанавливает куки (JWT), если имя пользователя и пароль верны.

Я запрашиваю API у https://example.ngrok.io, и API находится на https://myAPIDomain.com.

Заголовок Set-cook ie присутствует в заголовке ответа, но файлы cookie не установлены (просмотр Chrome Приготовление приложения ie Хранилище).

Вот конфигурация сервера :

response.headers['Access-Control-Allow-Origin'] = request.headers['Origin']
response.headers.add('Access-Control-Allow-Credentials', 'true')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type')
response.headers.add('Access-Control-Allow-Headers', 'cache-control')
response.headers.add('Access-Control-Allow-Headers', 'X-Requested-With')
response.headers.add('Access-Control-Allow-Headers', 'Authorization')
response.headers.add('Access-Control-Allow-Headers', 'set-cookie')
response.headers.add('Access-Control-Allow-Headers', 'user-agent')
response.headers.add('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE')

Настройка cook ie в бэкэнде: resp.headers.add("set-cookie",'cookieKey:cookieValue; Domain=myAPIDomain.com; Max-Age=3600; Secure; Path=/; SameSite=None')

Также попытался не указывать домен: resp.headers.add("set-cookie",'cookieKey:cookieValue; Domain; Max-Age=3600; Secure; Path=/; SameSite=None')

Ни одно из этих решений не сработало.

Вот изображение заголовков ответов в Chrome: https://i.imgur.com/D3cq16Z.jpg

Файлы cookie, которые должен установить API, используется для будущей аутентификации конечной точки API. Поэтому, когда я отправляю другой запрос:

var myHeaders2 = new Headers();
myHeaders2.append("Content-Type", "application/json");

var requestOptions2 = {
  method: 'GET',
  headers: myHeaders,
  redirect: 'follow',
  credentials: 'include'
};

fetch("https://myAPIDomain.com/endpointWhichRequiresCookies", requestOptions2)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Но куки не отправляются (очевидно, поскольку chrome не устанавливает куки). Вот что получает бэкэнд: https://codebeautify.org/online-json-editor/cb81fb64

Я знаю, что обходной путь - ответить куки с помощью веб-интерфейса в виде ответа JSON, и веб-интерфейс отправляет куки в виде различных заголовков (так как вы не может отправить заголовок "cook ie" из внешнего интерфейса), но это не лучшее решение для нас.

Единственная причина, по которой мы вызываем API из ngrok, заключается в том, что мы проводим тестирование localhost.

Печенье устанавливается с почтальоном, поэтому я не думаю, что здесь виноват бэкэнд.

Есть идеи? Мы занимаемся этим уже несколько дней, не имея возможности решить проблему.

1 Ответ

0 голосов
/ 11 марта 2020

Нашли решение!

Мы отправляем два запроса:

  1. Вход в систему Отправить запрос с именем пользователя и паролем (используя Fetch POST)
  2. Запрос на получение информации из бэкэнда (используя Fetch GET) - Бэкэнд будет использовать куки, которые были установлены в запросе № 1 для аутентификации запроса.

Проблема заключалась в том, что мы не отправили запрос № 1 с учетными данными: "include ", потому что мы не думали, что это было необходимо для первого запроса. У нашего второго запроса всегда были учетные данные: «include», но, очевидно, Chrome будет игнорировать файлы cookie, если вы не установите учетные данные: «include» в обоих запросах.

...