2017-04-11 33 views
10

Jestem w rozszerzeniu Google Chrome z uprawnieniami dla "*://*/*" i próbuję zmienić wartość z XMLHttpRequest na Fetch API.Czytanie nagłówków odpowiedzi za pomocą interfejsu Fetch API

Rozszerzenie przechowuje dane logowania wprowadzane przez użytkownika, które wcześniej były umieszczane bezpośrednio w wywołaniu open() XHR dla uwierzytelniania HTTP, ale w obszarze pobierania nie można już używać bezpośrednio jako parametru. Dla HTTP podstawowe Auth, obejście tego ograniczenia jest trywialne, jak można ręcznie ustawić nagłówek Authorization:

fetch(url, { 
    headers: new Headers({ 'Authorization': 'Basic ' + btoa(login + ':' + pass) }) 
    } }); 

HTTP Digest Auth wymaga jednak większej interaktywności; musisz odczytać parametry wysyłane przez serwer z odpowiedzią 401, aby utworzyć ważny token autoryzacji. Próbowałem czytać pole nagłówka WWW-Authenticate odpowiedzi z tego fragmentu:

fetch(url).then(function(resp) { 
    resp.headers.forEach(function(val, key) { console.log(key + ' -> ' + val); }); 
} 

Ale mogę to wyjście:

content-type -> text/html; charset=iso-8859-1 

które samo w sobie jest poprawny, ale wciąż brakuje około 6 więcej pól według narzędzi programistycznych Chrome. Jeśli użyję resp.headers.get("WWW-Authenticate") (lub któregokolwiek z innych pól w tym zakresie), otrzymam tylko null.

Czy istnieje szansa na uzyskanie dostępu do innych pól przy użyciu interfejsu API pobierania?

Odpowiedz

7

Istnieje ograniczenie dostępu do nagłówków odpowiedzi podczas korzystania z interfejsu Fetch API przez CORS. Ze względu ty tego ograniczenia, można uzyskać dostęp jedynie następujące nagłówki standardowe:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

Podczas pisania kodu do rozszerzenia Google Chrome używasz CORS, dlatego nie masz dostępu do wszystkich nagłówków. Jeśli kontrolować serwer, można powrócić niestandardowych informacji w odpowiedzi body zamiast headers

Więcej informacji na temat tego ograniczenia - https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types

+0

@jules To ograniczenie dla CORS respektuje wartości w 'access-control-expose-headers' lub ewentualnie' access-control-allow-headers' (umieszczamy je w obu). – jacob

+0

'access-control-expose-headers' pracował dla mnie dla nagłówków zwróconych z serwera - wtedy nagłówki są dostępne poprzez obiekt nagłówków odpowiedzi pobierania. I 'access-control-allow-headers' został użyty, aby umożliwić nagłówkom Żądania na serwerze (lub otrzymałem komunikat o błędzie z serwera) – specimen

+1

To głupie, że nie jest to możliwe z Fetch, ale można to zrobić za pomocą XmlHttpRequest. Jaka jest przewaga związana z bezpieczeństwem, jeśli nadal jest możliwa dzięki obejściu? – sebas

3

Od MDN

Można również uzyskać wszystkie nagłówki poprzez dostęp wpisy iterator.

// Display the key/value pairs 
for (var pair of res.headers.entries()) { 
    console.log(pair[0]+ ': '+ pair[1]); 
} 

Również pamiętać this części:

Ze względów bezpieczeństwa niektóre nagłówki mogą być kontrolowane tylko przez agenta użytkownika. Do tych nagłówków należą niedozwolone nazwy nagłówków i zabronione nazwy nagłówków odpowiedzi.

+0

używając iteracyjnej prezentuje taki sam efekt; tylko pole typu zawartości.a listy zabronionych nazw nagłówków tylko wydają się mieć zastosowanie do modyfikacji, a "WWW-Authenticate" nie znajduje się w żadnej z nich. – jules