J'ai un script exécuté sur une page Web qui doit utiliser la méthode JQuery $ .ajax (actuellement en utilisant jquery 1.7.2) pour soumettre plusieurs requêtes GET à un point de terminaison de service sur un domaine différent. J'ai l'appel ajax qui fonctionne dans IE (9, 10, 11), mais il échoue avec une réponse 401 non autorisée dans Firefox et Chrome. Une partie du message d'erreur supplémentaire dans Chrome est "Une authentification complète est requise pour accéder à cette ressource".
Mon appel ajax est configuré comme ceci (dataType est "json" pour ces requêtes qui échouent et async est vrai):
$.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
}
});
Je transmets le nom d'utilisateur et le mot de passe requis pour accéder au service et cela fonctionne dans IE. Je comprenais que la fonction ajQuery de JQuery gérerait correctement l'authentification, donc si une réponse revenait indiquant qu'une autorisation était requise, elle utiliserait les informations d'identification fournies pour effectuer cette demande correctement. Est-ce que j'ai râté quelque chose? Dois-je ajouter manuellement l'en-tête d'autorisation pour que cela fonctionne?
MISE À JOUR: Voici les informations de demande, de réponse et de cookie rapportées par Chrome et IE via les outils de débogage F12 (certaines informations remplacées par [... supprimées) ...])
Chrome (42.0.2311.90 m)
En-têtes de réponse
access-control-allow-credentials: true access-control-allow-Origin: [... supprimé ...] access-control-expose-headers: cache-control: private, max-age = 0, must-revalidate connection : keep-alive content-encoding: gzip content-length: 296 content-type: text/html; charset = ISO-8859-1 date: Tue, 21 Apr 2015 20:55:12 GMT expire: Tue, 21 Apr 2015 20 : 55: 12 GMT p3p: CP = "NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA" set-cookie: JSESSIONID = qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13 ; Path = /; Secure; HttpOnly set-cookie: NSC_vt1.sbmmzefw.dpn! -! IUUQT = ffffffff09091c3945525d5f4f58455e445a4a42378b; path = /; secure; Statut httponly: 401 Version non autorisée: authentification HTTP: version 1.1 de base realm = "Rally ALM"
En-têtes de demande
: Hôte: rally1.rallydev.com: méthode: GET: chemin: [... supprimé ...]: schéma: https: version: HTTP/1.1 accepter: application/json, texte/javascript, /; q = 0.01 accept-encoding: gzip, deflate, sdch accept-language: en-US, en; q = 0.8 Origine: [... supprimé ...] référent: [... supprimé ...] user-agent : Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/42.0.2311.90 Safari/537.36
Cookies de réponse
JSESSIONID qd-app-1348vf1vrksvc76oshcwirvjp.qd-app-13 NSC_vt1.sbmmzefw.dpn! -! IUUQT ffffffff09091c3945525d5f4f58455e445a4a42378b
IE 11
En-têtes de demande
Demander GET [... supprimé ...] Référent [... supprimé ...] Accepter
application/json, texte/javascript, /; q = 0,01 Accept-Language en-US Accept-Encoding gzip, dégonflez l'agent utilisateur Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv: 11.0) comme Gecko Host [... supprimé ...] Connexion Conserver -Alive Cache-Control Cookie sans cache
JSESSIONID = qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08; NSC_vt1.sbmmzefw.dpn! -! IUUQT = ffffffff09091c3145525d5f4f58455e445a4a42378b; RALLY-Detail-treeCollapsed = false; ZSESSIONID = RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; SUBBUCKETID = 713En-têtes de réponse
Réponse HTTP/1.1 200 OK RallyRequestID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-0810353108 Expire jeu., 01 janv. 1970 00:00:00 GMT Content-Type text/javascript; charset = utf-8 ETag "0101c2c8d3463ee3c1a4f950d4142b7d3" P3P CP = "NON DSP COR CURa PSAa PSDa OUR NOR BUS PUR COM NAV STA" Cache-Control private, max-age = 0, must-revalidate Date mar, 21 avr 2015 20:58:17 GMT Connection keep-alive Set-Cookie ZSESSIONID = RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU; Path = /; Domain = [... supprimé ...]; Sécurisé; HttpOnly Set-Cookie SUBBUCKETID = 713 = /; Domaine = [... supprimé ...]; Sécurisé; HttpOnly Content-Length 319
Biscuits
Envoyé JSESSIONID qd-app-08xmftgye78tde1b0wzcl2kit4m.qd-app-08
Envoyé NSC_vt1.sbmmzefw.dpn -! IUUQT ffffffff09091c3145525d5f4f58455e445a4a42378b Envoyé RALLYE-détail-treeCollapsed faux Sent ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU Sent SUBBUCKETID 713 Reçu ZSESSIONID RpKo5acfRqmjPhW0vIU1rgurWmDhlka0lrGCY9MIWhU À la fin de la session [... supprimé ...]/Oui Reçu SUBBUCKETID 713 À la fin de la session [... supprimé ...]/Oui Oui
Je suis tombé sur un jquery forum post qui contenait des informations supplémentaires concernant ce problème. Sur la base de ce que j'ai trouvé là-bas, j'ai ajouté ceci à l'appel $ .ajax:
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', makeBaseAuth(user, pswd));
}
où makeBaseAuth () utilise la fonction btoa () comme ceci:
makeBaseAuth: function(user, pswd){
var token = user + ':' + pswd;
var hash = "";
if (btoa) {
hash = btoa(token);
}
return "Basic " + hash;
}
Cela semble fonctionner dans Chrome maintenant, je ne reçois pas d'invite de connexion ou de réponse 401, la demande est en cours et j'obtiens la réponse attendue. J'ai également supprimé l'option xhrFields: { withCredentials: true }
car cela ne semblait pas nécessaire. Pour une raison quelconque, cela ne fonctionne pas encore dans Firefox, et dans le débogueur Firefox, je ne peux pas réellement accéder au javascript pour faire un débogage décent pour voir quel est le problème, la façon dont ce script fonctionne est chargé dans une page Web comme un script anonyme et je n'ai aucun contrôle sur cela. J'ai un moyen d'obtenir le script dans IE et Chrome, mais pas Firefox pour une raison quelconque. Je considérerai cela comme une victoire juste pour le faire fonctionner dans Chrome, merci à tous pour vos remarques moi dans la bonne direction!