Angular игнорирует заголовки Set Cookie и Delete Cookie с помощью CORS - PullRequest
0 голосов
/ 22 октября 2018

Каждый запрос заполняется WithCredentialsInterceptor:

@Injectable()
export class WithCredentialsInterceptor implements HttpInterceptor {

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    request = request.clone({
      withCredentials: true
    });

    return next.handle(request);
  }
}

В задней части:

CORS промежуточного программного обеспечения:

// process.env.CLIENT = https://www.example.com
this.router.options('*', cors({origin: process.env.CLIENT, credentials: true}));

this.router.use(cors({origin: process.env.CLIENT, credentials: true}));

// On valid Login:
res.cookie('SESSIONID', createdSession, {maxAge: someTime, httpOnly: true, secure: true});

res.cookie('XSRF-TOKEN', createdToken, {maxAge: someTime});

Вразработка: ng serve --ssl

  1. Использование proxy.conf.json и НЕ cors - оба файла cookie были успешно установлены в видимой «корзине» (devtools -> application / storage -> cookie).

  2. Удаление proxy.conf.json в пользу CORS для имитации производственной архитектуры устанавливает только cookie XSRF, но SESSIONID, помеченный secure и httpOnly, являетсяНЕ.Заголовки отправляются в этом случае только X-XSRF-TOKEN (я предполагаю, что это ожидаемое поведение для поддельного HTTPS dev-сервера).

  3. Предполагается, что он будет работать должным образом внутри законногоHTTPS enviromnet, я приступил к работе со структурой.

Доменные имена следующие:

Проблема

ОБА куки неустановите в «банке печенья»

АЛЬТУХ: куки отображаются в заголовках ответов при успешном входе в систему:

Заголовки ответов:

set-cookie: XSRF-TOKEN=The-legit-XSRF-TOKEN; Max-Age=number; Path=/; Expires=Tue, 22 Oct 2019 18:56:31 GMT
set-cookie: SESSIONID=The-legit-SessionID-Token; Max-Age=number; Path=/; Expires=Tue, 22 Oct 2019 18:56:31 GMT; HttpOnly; Secure

И они также ОТПРАВЛЯЮТСЯ в следующем запросе:

Заголовки запроса

cookie: SESSIONID=The-legit-SessionID-Token; XSRF-TOKEN=The-legit-XSRF-TOKEN

Но XSRFInterceptor НЕ захватывает файл cookie, который он должен, и не являетсяон доступен через document.cookie, поэтому запрос НЕ отправляется с реализацией X-XSRF-TOKEN.

XSRFInterceptor:

@Injectable()
export class HttpXsrfInterceptor implements HttpInterceptor {

  constructor(private tokenExtractor: HttpXsrfTokenExtractor) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Obse rvable<HttpEvent<any>> {
    const HEADER_NAME = 'X-XSRF-TOKEN';
    // let TOKEN = document.cookie.split('; ').find(cookie => cookie.startsWith('XSRF-TOKEN'));
    let TOKEN = this.tokenExtractor.getToken() as string;
    if (TOKEN && !req.headers.has(HEADER_NAME)) {
      // TOKEN = TOKEN.split('=')[1];
      req = req.clone({ headers: req.headers.append(HEADER_NAME, TOKEN) });
    }
    console.log(req) // <-- withCredentials: true
    return next.handle(req);
  }
}

В журналах сервера я получаю подтверждениеn файлы cookie приняты хорошо, но из-за того, что XSRFInterceptor не удалось извлечь токен, промежуточное ПО сбивает мой запрос:

console.log(csrfCookie, csrfHeader); // The-legit-XSRF-TOKEN, undefined

console.log(csrfCookie === csrfHeader); // false

Мне удалось войти в систему, скопировав действительные SESSIONID и XSRF-TOKEN в банку с печеньем и при попытке выйти из системы - я заметил, что Angular также игнорирует DELETE cookie заголовки, отправленные с сервера, так как меня постепенно переносили на страницу входа, хотя скопированные куки НЕ были удалены.

Кто-нибудь признает эту проблему?

1 Ответ

0 голосов
/ 24 октября 2018

Решено,

В res.cookie Я добавил domain: '.example.com'.

Без какой-либо спецификации домена, в среде разработчика по умолчанию установлено значение localhost, которое одинаково в обоих концах.Но в производстве я думаю, что по умолчанию он равен api.example.com и, поскольку он не совпадал с исходным URL-адресом www.example.com, браузер не рассматривал его как нечто, что должно быть помещено в банку.

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