Les en-têtes de demande d’autorisation Ajax échouent encore et encore

Je travaille sur un consommateur pour une API créée par lui-même et éprouve de sérieuses difficultés à définir l’en- tête Authorization . J’utilise JQuery pour les requêtes Ajax, mais l’ option ‘beforeSend’ ne fonctionne pas du tout (utiliser fiddler pour examiner les requêtes)

Ceci est mon code beforeSend:

$.ajax({ type: "GET", url: url+"/Projects", contentType: "application/json; charset=utf-8", beforeSend: function (req) { req.setRequestHeader("Authorization", AuthBuilder(username, password)); }, success: function (result) { alert("success"); }, error: function (xhr, ajaxOptions, thrownError) { alert("fail"); } }); 

Eh bien, si cela échoue, que faites-vous? Retournez à l’ancienne méthode d’envoi de requêtes ajax … cela ne fonctionne pas non plus …

C’est mon code habituel:

 function GET(address, callback, error) { Request = getXMLHttpObject(); Request.open("GET", url + address, true); var base64 = Base64.encode(username + ":" + password); alert(base64); Request.setRequestHeader("Authorization", "Basic " + base64); Request.send(); Request.onreadystatechange = function () { //alert(Request.readyState+" code "+Request.status); if (Request.readyState == 4 && Request.status == 200) { callback(jQuery.parseJSON(Request.responseText)); } else if (Request.readyState == 4 && Request.status >= 400) { error(Request.status, Request.statusText); } } } 

Ne faites pas attention au fait que je ne demande pas json spécifiquement parce que le service renvoie json par défaut .

En informations supplémentaires:

  • peu importe l’origine, le service autorise toutes les origines (testé et confirmé)
  • L’autorisation fonctionne lorsqu’elle est définie par des en-têtes (testée dans d’autres clients).
  • les en-têtes d’autorisation ne sont tout simplement pas envoyés
  • AuthBuilder (nom d’utilisateur, mot de passe)) donne le format correct du contenu de l’en-tête Basic Auth
  • la getXMLHttpObject () est juste un code copier-coller et travaillé avant

Des pensées ?

Eh bien, j’ai découvert quel était le problème. Le service fabriqué par ses soins l’a renvoyé au client sous forme d’en-tête global: “Access-Control-Allow-Headers” avec uniquement “Content-Type”.

De cette façon, nos clients n’utilisant pas d’agent d’utilisateur (navigateur) ont ignoré ces en-têtes et n’ont tout simplement envoyé que l’en-tête. Mais le navigateur a essayé d’optimiser la requête et a déclaré: “Il n’acceptera pas l’en-tête Authorization, je vais donc le couper avant de l’envoyer.” De cette façon, le paquet est plus petit et le service ne le permet pas de toute façon (bien que ce fût le cas …)

En ajoutant simplement “Autorisation” à la partie En-tête Autoriser le contrôle d’access du service, mes requêtes Javascript / JQuery / Ajax envoient l’en-tête de la requête comme d’habitude!