6
votes

Comment supprimer la boîte de dialogue "Authentification requise" du navigateur lors d'un appel AJAX nécessitant une authentification?

Mes utilisateurs entrent un nom d'utilisateur et un mot de passe pour un service tiers. Je fais un appel Ajax à ce service pour leur authentifier. Le problème est que s'ils entrent dans le mauvais nom d'utilisateur et mot de passe, le navigateur (au moins Firefox) affiche une boîte de dialogue "Authentification requise". S'ils entrent ensuite le nom d'utilisateur et le mot de passe corrects dans cette boîte de dialogue, mon appel AJAX retournera un "succès", et il apparaît que l'utilisateur / passe d'origine qu'ils sont entrés étaient corrects, quand il n'est pas (puisqu'ils l'ont changé). Y a-t-il un moyen de supprimer cette boîte de dialogue (donc je peux alors avoir mon service leur dire de corriger leur utilisateur / votre passe) ou de saisir en quelque sorte le nom d'utilisateur et le mot de passe corrects que l'utilisateur entré dans la boîte de dialogue Browersers? Ceci est une extension Firefox .. Donc, je suis sûr qu'il y a un moyen de saisir la bonne passe / connexion à partir de la demande. Mais ce serait bien s'il y avait une méthode plus simple via JavaScript. P>

jQuery.ajax({
  type: "GET",
  dataType: "xml",
  url: endpoint,
  username: username,
  password: password,
  success: function(data,status) {
    // Do something
  },
  error: function(XMLHttpRequest, textStatus, errorThrown){
    alert(errorThrown);
  }
});


0 commentaires

5 Réponses :


1
votes

au lieu de la chaîne d'URL étant " http://blah.com ", faites-le " http: // utilisateur: mot de passe@blah.com " xxx


1 commentaires

Cela résoudrait-il vraiment le problème? J'attendrais que si le nom d'utilisateur et le mot de passe spécifié dans l'URL étaient incorrects, le serveur distant émettrait toujours une réponse 401 ...



-1
votes

Vous ne pouvez pas le faire dans IE ou Firefox, et vous ne pourrez jamais du JavaScript pour des raisons de sécurité. Il n'y a pas de paramètre de navigateur qui permet à l'utilisateur d'éviter d'être invité à l'authentification HTTP. Cela devient réel ennuyeux lorsque vous avez 50 images nécessitant une authentification HTTP.


0 commentaires

1
votes

J'ai résolu ce problème en mettant un proxy entre le navigateur et le service qui nécessite une authentification, dans mon cas, un servlet Java. Le navigateur envoie la demande Ajax au servlet, qui transfère la demande au service, puis renvoie la réponse des services, omettant l'en-tête "Authentification www". Votre application de navigateur. gère le code de réponse HTTP 200 ou 401 en conséquence.

De même, le proxy pourrait toujours revenir à 200 avec une réponse JSON indiquant les résultats de la demande transférée. De cette façon, vous pouvez discerner la différence entre une défaillance de votre proxy et la réponse du service.

Une chose délicate que vous devriez avoir à traiter - si le service d'extrémité répond avec un en-tête Set-Cookie, dites parce qu'il a créé une session pour votre client, vous avez (au moins) 2 chemins possibles à prendre.

  1. Votre proxy se souviendra de la cookie, de votre application de navigateur. Passez toujours par le proxy pour ce service et le proxy ajoute ce cookie aux demandes suivies ultérieures. ou
  2. Vous ignorez le cookie du service et vous avez le navigateur à ré-authentifier directement avec le service une fois que vous avez vérifié le nom d'utilisateur et le mot de passe via le proxy. Cela peut avoir l'effet secondaire de créer une session orpheline avec le service

0 commentaires

0
votes

sans jQuery (ne fonctionne pas dans IE, mais c'est correct pour une extension Firefox):

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://example.com", true, "username", "password");
xhr.onreadystatechange = function(){
  if(this.readyState == 4){
    if(this.status == 200){
      alert("we got a response");
    }
  }
}
xhr.send();


0 commentaires

0
votes

Que diriez-vous de ne pas utiliser l'authentification HTTP? Utilisez un identifiant standard avec des cookies ou postez simplement le nom d'utilisateur / mot de passe que l'utilisateur fournit au script et consultez les détails sur une base de données d'utilisateurs.


1 commentaires

Il a dit qu'il s'agissait d'un produit tiers.