Estoy en una extensión de Google Chrome con permisos para "*://*/*" y estoy tratando de cambiar de XMLHttpRequest a Fetch API .
La extensión almacena los datos de inicio de sesión ingresados por el usuario que solían colocarse directamente en la llamada open() de XHR para autenticación HTTP, pero en Fetch ya no se puede usar directamente como parámetro. Para HTTP Basic Auth, eludir esta limitación es trivial, ya que puede configurar manualmente un encabezado de autorización:
fetch(url, { headers: new Headers({ 'Authorization': 'Basic ' + btoa(login + ':' + pass) }) } }); Sin embargo, HTTP Digest Auth requiere más interactividad; necesita leer los parámetros que el servidor le envía con su respuesta 401 para crear un token de autorización válido. Intenté leer el campo de encabezado de respuesta WWW-Authenticate con este fragmento:
fetch(url).then(function(resp) { resp.headers.forEach(function(val, key) { console.log(key + ' -> ' + val); }); }Pero todo lo que obtengo es esta salida:
content-type -> text/html; charset=iso-8859-1 Lo cual en sí mismo es correcto, pero aún faltan alrededor de 6 campos más según las Herramientas para desarrolladores de Chrome. Si uso resp.headers.get("WWW-Authenticate") (o cualquiera de los otros campos), solo obtengo null .
¿Alguna posibilidad de llegar a esos otros campos usando la API Fetch?
Hay una restricción para acceder a los encabezados de respuesta cuando usa Fetch API sobre CORS. Debido a esta restricción, solo puede acceder a los siguientes encabezados estándar:
Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma Cuando está escribiendo código para la extensión de Google Chrome, está utilizando CORS , por lo tanto, no puede acceder a todos los encabezados. Si controla el servidor, puede devolver información personalizada en el body de la respuesta en lugar de headers
Más información sobre esta restricción: https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types
Fetch no muestra encabezados durante la depuración o si responde console.log .
Tienes que usar la siguiente manera para acceder a los encabezados.
response.headers.get('x-auth-token')Desde MDN
También puede obtener todos los encabezados accediendo al iterador de entradas.
// Display the key/value pairs for (var pair of res.headers.entries()) { console.log(pair[0]+ ': '+ pair[1]); }Además, ten en cuenta esta parte:
Por razones de seguridad, algunos encabezados solo pueden ser controlados por el agente de usuario. Estos encabezados incluyen los nombres de encabezados prohibidos y los nombres de encabezados de respuesta prohibidos.