2015-04-21 20 views
7

Mam skrypt uruchomiony na stronie internetowej, która musi używać metody JQuery $ .ajax (obecnie używa jquery 1.7.2) przesłać kilka żądań GET do punktu końcowego usługi w innej domenie. Mam wywołanie ajax działające w IE (9, 10, 11), ale kończy się niepowodzeniem z 401 nieautoryzowaną odpowiedzią w Firefoksie i Chrome. Częścią dodatkowego komunikatu o błędzie w Chrome jest "Pełne uwierzytelnienie jest wymagane, aby uzyskać dostęp do tego zasobu".

Moje ajax wywołanie jest ustawiony tak (dataType jest „json” dla tych wniosków, które nie, i asynchroniczny jest prawdą):

$.ajax({ 
     url: url, 
     type: "GET", 
     async: isAsync, 
     dataType: dataType, 
     username: user, 
     password: pswd, 
     success: function (response, status) { 
     // success code here 
     }, 
     failure: function (response, status) { 
     // failure code here 
     }, 
     complete: function (xhr, status) { 
     // on complete code here 
     } 
    }); 

jestem przekazując nazwę użytkownika i hasło wymagane do uzyskania dostępu do usługi i działa to w IE. Rozumiem, że funkcja ajax JQuery poprawnie obsłuży uwierzytelnianie, więc jeśli pojawi się odpowiedź wskazująca, że ​​autoryzacja jest wymagana, użyłaby poświadczeń, które zostały dostarczone, aby poprawnie wykonać to żądanie. Czy coś mi umyka? Czy muszę ręcznie dodać nagłówek autoryzacji, aby działało?

UPDATE: Oto wniosek, odpowiedzi i informacji Cookie zgłoszone przez Chrome i IE za pomocą narzędzi debugowania F12 (kilka informacji zastąpione [... usuniętej ...])

Chrome (42,0 .2311.90 m)

nagłówki odpowiedzi

access-control-allow-poświadczenia: pochodzenie kontroli dostępu, umożliwiający- prawdziwe: [... usunięte ...] kontroli dostępu, wystawiać -hea ders: kontrola pamięci podręcznej: prywatna, max-age = 0, konieczne ponowne potwierdzenie połączenia: keep-alive kodowanie treści: długość zawartości gzip: 296 typ treści: text/html; charset = ISO-8859-1 data: wt., 21 kwietnia 2015 r. 20:55:12 GMT wygaśnie: wtorek, 21 kwietnia 2015 20:55:12 GMT p3p: CP = "Non DSP COR CURa PSAa PSDa NASZE NOR BUS PUR COM NAV STA" zestaw- Cookie: JSESSIONID = QD-app-1348vf1vrksvc76oshcwirvjp.qd-app-13; path = /; Bezpieczne; HttpOnly set-Cookie:! NSC_vt1.sbmmzefw.dpn - IUUQT = ffffffff09091c3945525d5f4f58455e445a4a42378b; path = /; zabezpieczyć; HttpOnly cywilny: 401 Nieautoryzowane zmieniają się: Zaakceptuj-Kodowanie: HTTP/1.1 www-authenticate: Basic realm = "Rally ALM"

Żądanie Główki

: host: rally1.rallydev.com: Metoda: GET: ścieżka [... usunięte ...] : Schemat: https: Wersja: HTTP/1.1 zaakceptować: application/json, tekst/javascript, /; q = 0.01 accept-encoding: gzip, deflate, sdch accept-language: en-US, en; q = 0.8 origin: [... removed ...] referer: [... removed ...] user -agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537,36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537,36

Cookies Response

JSESSIONID QD-app-1348vf1vrksvc76oshcwirvjp.qd -app-13 NSC_vt1.sbmmzefw.dpn! -!IUUQT ffffffff09091c3945525d5f4f58455e445a4a42378b

IE 11

Żądanie Główki

żądanie GET [... usunięte ...] Referer [... usunięte ...] Zebrane
aplikację/json, tekst/javascript, /; q = 0.01 Accept-Language pl-US Zaakceptuj kodowanie gzip, deflate User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv: 11.0) jak host Gecko [... usunięty ...] Connection Keep-Alive Cache-Control no-cache Cookie
JSESSIONID = qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08; NSC_vt1.sbmmzefw.dpn! -! IUUQT = ffffffff09091c3145525d5f4f58455e445a4a42378b; RALLY-Detail-treeCollapsed = false; ZSESSIONID = RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; SUBBUCKETID = 713

nagłówki odpowiedzi

HTTP Response/1.1 200 OK RallyRequestID QD-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-0810353108 Wygasa Thu, 01 stycznia 1970 00:00:00 GMT Content-Type text/javascript; charset = UTF-8 ETag "0101c2c8d3463ee3c1a4f950d4142b7d3" P3P CP = "NON DSP COR Cura PsaA PSDa NASZ NOR BUS PUR COM NAV STA" Cache-Control prywatne, max-age = 0, must-revalidate Data Tue, 21 kwietnia 2015 20:58:17 GMT połączenia keep-alive Set-Cookie ZSESSIONID = RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; Path = /; Domain = [... usunięte ...]; Bezpieczne; HttpOnly Set-Cookie SUBBUCKETID = 713; Path =/; Domain = [... usunięte ...]; bezpieczni; HttpOnly Content-Length 319

Cookies

Wysłane JSESSIONID QD-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08
Wysłane NSC_vt1.sbmmzefw.dpn -! IUUQT ffffffff09091c3145525d5f4f58455e445a4a42378b Wysłane RALLY-Detail-treeCollapsed fałszywe Wysłane ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU Wysłane SUBBUCKETID 713 Received ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU Pod koniec sesji [... usunięte ...]/Tak Tak Otrzymane SUBBUCKETID 713 na koniec sesji [... usunięte ...]/Tak

+0

Czy próbowałeś debugowania za pomocą narzędzi programistycznych w chrome lub firefox? – brso05

+0

Sprawdź ruch sieciowy i zobacz, jaki typ żądania i odpowiedzi otrzymujesz, analizując żądanie i odpowiedź, aby sprawdzić, czy coś wygląda inaczej niż np. – brso05

+0

'401' jest zwykle zwracany przez serwer. Czy uwierzytelniasz się w zdalnej domenie (używając plików cookie, uwierzytelniania HTTP lub w inny sposób?). Twoja przeglądarka może nie wysyłać wymaganego uwierzytelnienia we wszystkich przypadkach. – arcyqwerty

Odpowiedz

6

natknąłem się jquery forum post że miał pewne dodatkowe informacje dotyczące tej kwestii. Na podstawie tego, co tam znalazłem, dodałem to do $ .ajax wywołania:

beforeSend: function (xhr) { 
    xhr.setRequestHeader('Authorization', makeBaseAuth(user, pswd)); 
    } 

gdzie makeBaseAuth() używa funkcji btoa() tak:

makeBaseAuth: function(user, pswd){ 
     var token = user + ':' + pswd; 
     var hash = ""; 
     if (btoa) { 
     hash = btoa(token); 
     } 
     return "Basic " + hash; 
    } 

To wydaje się działać w Chrome teraz, nie otrzymuję loginu lub odpowiedzi 401, żądanie przechodzi i otrzymuję oczekiwaną odpowiedź. Usunąłem także opcję xhrFields: { withCredentials: true }, ponieważ nie wydaje się to konieczne.Z jakiegoś powodu to nie działa jeszcze w Firefoksie, a w debugerze Firefoksa nie mogę dostać się do javascripta, żeby zrobić porządne debugowanie, aby zobaczyć, na czym polega problem, sposób działania tego skryptu jest załadowany do strony internetowej jako anonimowy skrypt i nie mam nad tym żadnej kontroli. Mam sposób, aby dostać się do skryptu w IE i Chrome, ale nie Firefox z jakiegoś powodu. Rozważę to jako wygraną, która sprawi, że zacznie działać w Chrome, dzięki wszystkim, że popchnęli mnie we właściwym kierunku!

Powiązane problemy