Файлы cookie исчезают после перенаправления - PullRequest
0 голосов
/ 16 января 2019

у меня есть:

1) Клиентское приложение, имеющее собственный домен: http://client.com

2) Приложение на стороне сервера с отдельным доменом: http://server.com

Теперь

сценарий:

1) Открытие http://client.com/home в браузере, который отображает HTML-страницу.

2) http://client.com/home перенаправляет на http://server.com/login

3) http://server.com/login сохраняет cookie "auth" и отправляет инструкцию по перенаправлению на http://client.com/welcome

Ответ:

Access-Control-Allow-Origin: *

Соединение: keep-alive

Длина содержимого: 104

Content-Type: text / html; кодировка = UTF-8 * +1036 *

Дата: ср., 16 января 2019 г. 10:47:11 по Гринвичу

Расположение: http://client.com/welcome

Set-Cookie: auth = 1479da80-197c-11e9-ba74-59606594e2fb; Path = /

Варь: Принять

X-Powered-By: Express

4) Браузер получает ответ, который содержит cookie 'auth'

5) Браузер перенаправляет себя на http://client.com/welcome

6) cookie "auth" отправляется на http://client.com/welcome

Запрос:

Cookie: auth = 1479da80-197c-11e9-ba74-59606594e2fb

7) http://client.com/welcome возвращает HTML, но не возвращает cookie 'auth'

enter image description here

enter image description here

8) http://client.com/welcome отправляет AJAX-запрос на http://server.com/data (CORS включен), но файл cookie "auth" не отправляется

9) http://server.com/data не распознает пользователя, потому что нет cookie

Клиентская сторона - это угловое приложение, размещенное на Node.js

Edit:

Как и предполагалось, я добавил в ответ server.com:

Access-Control-Allow-Credentials: true

но ничего не изменилось.

Соответствующий код на стороне клиента:

const headerOptions = new HttpHeaders({
      'Content-Type': 'application/json', 'withCredentials': 'true', 'Access-Control-Allow-Origin': 'true', 'Access-Control-Allow-Credentials': 'true'
    });

this.httpClient.get<any>(this.baseUrl + "data", { headers: headerOptions }).subscribe((res) => {

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Из спецификации Access-Control-Allow-Origin: Для запросов без учетных данных можно указать буквенное значение "" в качестве символа подстановки; *

Попробуйте добавить определенный домен в поле Access-Control-Allow-Origin.

Я думаю, вы должны использовать прокси в угловых приложениях. Для получения дополнительной информации проверьте эту ссылку: https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md

0 голосов
/ 24 января 2019

Ваше описание происходящего не выглядит правильным.

Это не (или, по крайней мере, не должно), что происходит.Когда браузер запрашивает http://server.com/login и возвращает в ответ заголовок Set-Cookie, файл cookie включается и ограничивается доменом server.com, даже если ответ является перенаправлением.Если вы видите файл cookie «auth», отправленный на client.com, то это файл cookie, который ранее был установлен client.com.

В любом случае, похоже, что вы действительно заботитесь о

Существует множество причин, по которым это можетслучиться.

  • CORS .Вы упомянули, что это было включено CORS, но ради других, читающих это, у вас должны быть установлены следующие заголовки CORS на server.com
    • Access-Control-Allow-Origin: http://client.com
    • Access-Control-Allow-Credentials: true
  • Обратите внимание, что при отправке учетных данных невозможно использовать подстановочный знак для Access-Control-Allow-Origin.Также обратите внимание, что источник должен быть точным совпадением, включая схему (http или https).На практике обычно серверы читают заголовок Origin запроса, сверяют его с белым списком и, если это разрешено, копируют значение заголовка Origin из запроса в заголовок Access-Control-Allow-Origin в ответе.
  • Вы должны установить xhr.withCredentials = true в своем запросе XHR.(См. MDN для получения более подробной информации.)

Затем, после того, как вы все это сделали, у вас на пути будет еще одно препятствие.Поскольку вы используете client.com и пытаетесь отправить cookie на server.com, cookie server.com считается сторонним.AFAIK У всех основных браузеров есть настройка, которая блокирует сторонние куки для конфиденциальности, потому что они чаще всего используются трекерами для сбора маркетинговых данных для рекламы.Я считаю, что большинство из них по умолчанию блокируют сторонние куки, но я не уверен в этом.Наверняка многие люди настроили свои браузеры на блокировку сторонних файлов cookie.

Поэтому вы должны сказать своим посетителям настроить свой браузер на разрешение сторонних файлов cookie с server.com.

.Кстати, небезопасно устанавливать cookie при перенаправлении в другой домен.Хотя это разрешено по спецификации AFAIK, возникли проблемы с поддержкой браузера.См., Например, эту ошибку Chrome .

0 голосов
/ 21 января 2019

Вы должны использовать опцию withCredentials при отправке запроса ajax на ваш http://server.com, и ваш server.com должен иметь для Access-Control-Allow-Credentials значение true.

Example code in Node.JS server:

var cors = require('cors');
var corsOptions = {
    origin: '*',
    credentials: true };

app.use(cors(corsOptions));

Подробнее об этом здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

Example code in Angular.JS client
import {RequestOptions, Request, RequestMethod} from '@angular/http';

const options = new RequestOptions({
  method: RequestMethod.Post,
  url: 'https://google.com',
  withCredentials: true
});

Подробнее об этом здесь: https://angular.io/api/http/RequestOptions

Также проверьте это : https://github.com/angular/angular/issues/24283 - похоже, у определенной версии Angular были проблемы с этим флагом, поэтому, если вы не используете более свежую версию, вам может понадобиться установить заголовок явно.

Причина этого заключается в том, что, если сервер явно не сообщит клиенту «Я буду принимать файлы cookie (установленные ранее в моем домене), передаваемые другим доменом» * - принятие файлов cookie будет безопасным выпуск. Подробнее здесь: https://en.wikipedia.org/wiki/Cross-site_request_forgery

...