2013-10-07 29 views
8

需要使用JavaScript(www.domain1.com)中的基本身份驗證進行REST GET調用。 REST API位於domain2.com中。 REST API返回CORS特定的HTTP頭。我需要支持IE,Chrome和Firefox。下面的JavaScript解釋了問題的進一步 -基於XMLHttpRequest的CORS基本身份驗證調用在Firefox和Chrome中失敗

  1. 沒有基本認證(在IE 10,Chrome和火狐,是由XDomainRequest對象照顧年長的IE)

    var xhr = new XMLHttpRequest(); 
    xhr.open(method, url, true); 
    
  2. 使用基本身份驗證(作品IE 10只,未能在鉻和Firefox)

    var xhr = new XMLHttpRequest(); 
    xhr.open(method, url, true, username, password); 
    
  3. 隨着基本認證(未能在鉻和Firefox)

    var xhr = new XMLHttpRequest(); 
    xhr.open(method, url, true); 
    xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); 
    xhr. withCredentials = 「true」; 
    
  4. 使用基本身份驗證(在Chrome和Firefox失敗)

    $.ajax({ 
    type: 'GET', 
    url: jsonp_url, 
    dataType: "json", 
    username: username, 
    password: pwd, 
    beforeSend: function (xhr) {xhr.withCredentials = true; }, 
    success: function (result) { }, 
    error: function (xhr, ajaxOptions, thrownError) { 
    } 
    

    我喜歡這裏,在Chrome和Firefox與基本驗證

+1

你可以發佈迴應標題嗎? – idbehold

回答

7

它得到了工作得到一個解決方案解決。注意到瀏覽器使用身份驗證分兩步進行跨域調用 - 在實際請求之前進行預檢。此預印電話的性質在IE和[Chrome + Firefox]中有所不同。 IE做了一個HTTP GET預檢呼叫,它返回401,然後在實際請求中發送認證詳細信息。但是,Chrome和Firefox採用更安全的方法,通過HTTP OPTIONS調用來檢查Web服務器支持的所有內容(CORS)(允許哪些域/是否支持GET/POST等),並且下一個調用與實際的HTTP GET請求一致與認證。

不幸的是,API端是以這樣的方式編碼的,即它正在驗證每個Http調用。這就是爲什麼即使HTTP OPTIONS調用也回來了401. [chrome + Firefox]在預檢呼叫之後立即拋出異常。

在API方面,修改代碼在OPTIONS調用的情況下不返回401,並且它開始工作。