444 votes

Utilisez l'authentification de base avec jQuery et Ajax

Je tente de créer une authentification de base à travers le navigateur, mais je n'y arrive pas vraiment.

Si ce script n'est pas là, l'authentification du navigateur prendra le relais, mais je veux dire au navigateur que l'utilisateur s'apprête à faire l'authentification.

L'adresse devrait ressembler à :

http://username:password@server.in.local/

J'ai un formulaire :

Et un script :

var username = $("input#username").val();
var password = $("input#password").val();

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = Base64.encode(tok);
  return "Basic " + hash;
}
$.ajax
  ({
    type: "GET",
    url: "index1.php",
    dataType: 'json',
    async: false,
    data: '{"username": "' + username + '", "password" : "' + password + '"}',
    success: function (){
    alert('Merci pour votre commentaire !');
    }
});

6 votes

Donc vous ne voulez pas que le navigateur gère l'authentification BASIC ? Pourquoi ne pas simplement utiliser l'authentification basée sur un formulaire ?

1 votes

@no.good.at.coding Si vous avez besoin d'intégrer avec une API tierce derrière une authentification (c'est ce que j'essaie de faire - developer.zendesk.com/rest_api/docs/core/…)

500voto

gustavogb Points 2681

Utilisez le rappel beforeSend de jQuery pour ajouter un en-tête HTTP avec les informations d'authentification :

beforeSend: function(xhr) {
    xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password));
},

6 votes

Je suis en train d'utiliser l'exemple que vous avez donné mais ça ne fonctionne pas ` $.ajax ({ url: "server.in.local/index.php", beforeSend: function (xhr) { xhr.setRequestHeader("Authorization", "Basic " + encodeBase64("nom d'utilisateur: mot de passe")); }, succes: function(val) { //alert(val); alert("Merci pour votre commentaire!"); } });`

70 votes

beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); }; fonctionne pour moi

12 votes

Problème... Si les informations d'identification que je fournis échouent, dans Chrome, l'utilisateur est ensuite invité à saisir à nouveau son nom d'utilisateur/mot de passe. Comment puis-je empêcher l'apparition de ce second dialogue si les informations d'identification échouent ?

375voto

jmanning2k Points 3354

Comment les choses changent en un an. En plus de l'attribut d'en-tête à la place de xhr.setRequestHeader, la version actuelle de jQuery (1.7.2+) inclut un attribut de nom d'utilisateur et de mot de passe avec l'appel $.ajax.

$.ajax
({
  type: "GET",
  url: "index1.php",
  dataType: 'json',
  username: username,
  password: password,
  data: '{ "comment" }',
  success: function (){
    alert('Merci pour votre commentaire!'); 
  }
});

MODIFICATION à partir de commentaires et d'autres réponses : Pour être clair - pour envoyer préventivement une authentification sans une réponse 401 Unauthorized, au lieu de setRequestHeader (pré-1.7) utilisez 'headers':

$.ajax
({
  type: "GET",
  url: "index1.php",
  dataType: 'json',
  headers: {
    "Authorization": "Basic " + btoa(USERNAME + ":" + PASSWORD)
  },
  data: '{ "comment" }',
  success: function (){
    alert('Merci pour votre commentaire!'); 
  }
});

15 votes

Ne devrait-il pas être nom d'utilisateur et non utilisateur? De plus, ce n'est pas exactement la même chose : d'après la documentation en ligne et mon expérience, il semble que ce ne soit pas préventif comme le nécessitent certaines APIs. En d'autres termes, il envoie l'en-tête Autorisation uniquement lorsqu'un code 401 est renvoyé.

3 votes

@StefanoFratini - vous avez raison sur les deux points. J'ai corrigé le champ du nom d'utilisateur, et il est bon de savoir la différence entre l'authentification préemptive et répondre uniquement au défi. Définir l'en-tête explicitement comme dans d'autres réponses permettra d'utiliser cette variante 'passive' de l'authentification de base.

0 votes

Pour moi, l'option ci-dessus n'a pas fonctionné, cela a fonctionné comme un charme.. merci

64voto

Adrian Toman Points 4852

Utilisez le callback beforeSend pour ajouter un en-tête HTTP avec l'information d'authentification comme suit :

var username = $("input#username").val();
var password = $("input#password").val();  

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = btoa(tok);
  return "Basic " + hash;
}
$.ajax
  ({
    type: "GET",
    url: "index1.php",
    dataType: 'json',
    async: false,
    data: '{}',
    beforeSend: function (xhr){ 
        xhr.setRequestHeader('Authorization', make_base_auth(username, password)); 
    },
    success: function (){
        alert('Merci pour votre commentaire!'); 
    }
});

4 votes

Vous devriez remarquer que "btoa" utilisé ici pour le chiffrement en Base64 n'est pas pris en charge dans les versions d'IE inférieures à 10 et sur certaines plateformes mobiles.

1 votes

Aussi, selon cette developer.mozilla.org/fr/docs/DOM/window.btoa vous devriez utiliser btoa(unescape(encodeURIComponent(str)))

0 votes

@SET, je suppose que cela doit être btoa(encodeURIComponent(escape(str)))

41voto

AsemRadhwi Points 587

Ou, il suffit d'utiliser la propriété des en-têtes introduite dans la version 1.5 :

headers: {"Authorization": "Basic xxxx"}

Référence : jQuery Ajax API

0 votes

Pouvez-vous me dire, s'il vous plaît, comment le faire pour chaque utilisateur? C'est-à-dire obtenir le jeton API pour chaque utilisateur à partir de la base de données et l'envoyer avec l'en-tête ajax.

23voto

Yossi Shasho Points 1209

Utilisez la fonction jQuery ajaxSetup, qui permet de définir des valeurs par défaut pour toutes les requêtes ajax.

$.ajaxSetup({
  headers: {
    'Authorization': "Basic XXXXX"
  }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X