2017-04-11 178 views
10

我處於Google Chrome擴展程序,其權限爲"*://*/*",我試圖從XMLHttpRequest切換到Fetch API使用Fetch API讀取響應標頭

擴展存儲用戶輸入的登錄數據,這些數據以前直接放入XHR的open()調用中進行HTTP身份驗證,但在Fetch下不能再直接用作參數。對於HTTP基本認證,避開這種限制是微不足道的,因爲你可以手工設置Authorization頭:

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

HTTP Digest Auth但是需要更多的交互;您需要讀取服務器通過401響應發送的參數來製作有效的授權令牌。我試着讀WWW-Authenticate響應報頭字段在這個片段:

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

但我得到的是這樣的輸出:

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

這本身是正確的,但是這仍下落不明周圍6個領域根據Chrome的開發者工具。如果我使用resp.headers.get("WWW-Authenticate")(或任何其他領域的事),我只得到null

任何使用Fetch API訪問其他字段的機會?

回答

7

當您在CORS上使用Fetch API時,存在對訪問響應標頭的限制。由於你這種限制,你只能訪問下列標準頭:

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

當您編寫Google Chrome擴展程序的代碼時,您使用的是CORS,因此您無法訪問所有標題。如果你控制的服務器,你可以在響應body返回的自定義信息,而不是在此限制headers

更多信息 - 使用迭代https://developers.google.com/web/updates/2015/03/introduction-to-fetch#response_types

+0

@jules CORS的這個限制遵循'access-control-expose-headers'中的值,或者可能是'access-control-allow-headers'(我們把它放在兩個中)。 – jacob

+0

'access-control-expose-headers'爲我處理從服務器返回的頭文件 - 然後頭文件可通過獲取響應頭文件對象獲得。 'access-control-allow-headers'用於允許服務器上的請求標題(或者我從服務器收到錯誤消息) – specimen

+1

這對於Fetch來說不可能實現,但可以通過XmlHttpRequest完成。如果解決方法仍有可能,安全優勢如何? – sebas

3

MDN

您也可以通過訪問條目迭代器得到所有的標題。

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

而且,記住this部分:

出於安全原因,一些頭只能由用戶代理進行控制。這些標題包括禁止的標題名稱和禁止的響應標題名稱。

+0

呈現相同的輸出;只有內容類型的字段。而禁止標題名稱的列表似乎只適用於修改,並且「WWW-Authenticate」也未列在其中。 – jules