2013-10-07 15 views
8

Javascript'ten (www.domain1.com adresinden) Basic Auth ile bir REST GET çağrısı yapmalısınız. REST API, domain2.com'da. REST API, CORS'e özgü HTTP üstbilgileriyle döner. IE, Chrome ve Firefox'u desteklemem gerekiyor. JavaScript ayrıca konu açıklıyor Aşağıda -XMLHttpRequest tabanlı CORS, Firefox ve Chrome'da Temel Kimlik Doğrulama çağrısı başarısız oluyor

  1. Temel Auth Temel Auth ile (IE 10'da İŞLERİ, Chrome ve Firefox, XDomainRequest nesnesi tarafından Eski IE'lerin alınması bakımında)

    var xhr = new XMLHttpRequest(); 
    xhr.open(method, url, true); 
    
  2. olmadan (içinde İŞLERİ IE 10, sadece, Temel Auth ile Chrome ve Firefox)

    var xhr = new XMLHttpRequest(); 
    xhr.open(method, url, true, username, password); 
    
  3. (Chrome ve Firefox'ta başarısız)

    başarısız oluyorsa Temel Auth ile
    var xhr = new XMLHttpRequest(); 
    xhr.open(method, url, true); 
    xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); 
    xhr. withCredentials = “true”; 
    
  4. $.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) { 
    } 
    

    Burada O var Basic Auth

+1

Yanıt üstbilgilerini gönderir misiniz? – idbehold

cevap

7

ile Chrome ve FireFox çalıştığını bir çözüm elde etmek isteriz (Chrome ve Firefox'ta Başarısız) çözüldü. Tarayıcı, bu çapraz etki alanını 2 adımda Kimlik Doğrulama ile gerçekleştirir - gerçek istek öncesi ön arama çağrısı. Bu ön kontrol çağrısının yapısı IE ve [Chrome + Firefox] 'da farklıdır. IE, bir HTTP GET ön kontrol çağrısı yapar ve 401 ile geri gelir ve daha sonra asıl istekte kimlik doğrulama bilgilerini gönderir. Ancak, Chrome ve Firefox, HTTP sunucusunun CORS olarak neleri desteklediğini kontrol etmek için bir HTTP OPTIONS çağrısı yaparak daha güvenli bir yaklaşım izler (Hangi alan adlarına izin verilir/GET/POST'ı destekler vb.) Ve bir sonraki çağrı gerçek HTTP GET isteği ile gider kimlik doğrulaması ile. Ne yazık ki, API tarafı, her bir Http çağrısının doğrulanması için böyle bir şekilde kodlanmıştır. İşte bu yüzden HTTP SEÇENEKLERİ çağrısı bile 401 ile geri geliyordu. [Chrome + Firefox] ön uçuş çağrısından hemen sonra istisna atıyordu.

API tarafında, OPTIONS çağrıları için 401 değerini döndürmemesi için kodu değiştirdiniz ve çalışmaya başladı.

İlgili konular