2009-05-30 5 views
13

J'écris des fonctionnalités dynamiques côté navigateur et en utilisant HTTP Basic Auth pour protéger certaines ressources. L'expérience utilisateur est très importante et hautement personnalisée.Comment empêcher Firefox de demander un nom d'utilisateur/mot de passe avec HTTP Basic Auth avec JQuery AJAX?

Voici une méthode JQuery de test simple qui éventuellement permettra de tester si un utilisateur a fourni les informations d'identification droite sous une forme:

$(document).ready(function() { 
    $("#submit").click(function() { 
    var token = Base64.encode($('#username').val() + ':' + $('#password').val());   
    $.ajax({ 
     url: '/private', 
     method: 'GET', 
     async: false, 
     beforeSend: function(req) { 
     req.setRequestHeader('Authorization', 'test:password'); 
     }, 
     error: function(request, textStatus, error) { 
     if (request.status == 401) { 
      alert('401'); 
     } 
     } 
    }); 
    return false; 
    }); 
}); 

S'ils ne sont pas autorisés à accéder /private, au moment où ils devraient voir à la boîte d'alerte. Cependant, sur Firefox, un formulaire de connexion fourni par le navigateur apparaît (pour réessayer avec de nouvelles informations d'identification). Safari ne fait pas ça.

Nous voulons contrôler complètement l'expérience avec les formes personnalisées, les fondus, les transitions, etc. Comment puis-je empêcher la boîte par défaut de Firefox d'être affichée? (. Si ce sera un problème lorsque nous testons pour IE, j'aimerais entendre des solutions là aussi)

+1

Notez le suivi à http://stackoverflow.com/questions/928967/can-i-co-cache-into-not-including-a-www-authenticate-header-for-failed-http. –

Répondre

3

Malheureusement, je suis confronté au même problème ici. À mon avis, les navigateurs ne devraient pas donner d'invite pour un xmlhttprequest. J'aurais vraiment aimé que quelqu'un pousse cette cause parce que les gens veulent vraiment passer à jQuery pour leurs besoins d'authentification.

Eh bien voici l'aide que je peux vous donner, j'ai trouvé cette chose jQuery Digest, je ne sais pas ce que ça fait vraiment ou quoi que ce soit, mais si quelqu'un pouvait prendre ce code dans le bon sens, nous pourrions avoir système.

https://www.openhub.net/p/digestj

Je pense avec cette nouvelle option AuthDigestDomain pratique, nous pourrions avoir le script ci-dessus réécrite ou autre chose et avoir la zone sécurisée « liée » ensemble et nous pourrions franchir ce problème une fois pour toutes. Eh bien ... bonne chance =)

35

La solution consiste à définir l'en-tête WWW-Authenticate à autre chose que Basic. Par exemple le mettre à:

WWW-Authenticate: None 

ou

WWW-Authenticate: FormBased 

si vous utilisez la connexion par formulaire. Ensuite, le navigateur ne vous montrera pas une fenêtre de connexion.

+1

Comme indiqué dans le commentaire de réponse de la question connexe. Le 'WWW-Authenticate' devrait indiquer un (ou plusieurs) défi valide. Et je pense aussi que "Aucun" n'est pas réel. http://stackoverflow.com/questions/1748374/http-401-whats-an-appropriate-www-authenticate-header-value#comment-33722946 – mems

+1

S'il vous plaît chercher ici une solution sur la façon de résoudre ce problème avec Java et ** Spring Security **: http://stackoverflow.com/questions/19079687/rest-call-on-expired-session-http-401-response-causes-browser-to-display-login/19102959#19102959 – lanoxx

+1

C'est * la * solution, même si elle semble irrégulière. https://www.ietf.org/rfc/rfc2617.txt (4.6) spécifie plusieurs schémas, mais ne se limite pas à Basic, Digest etc.C'est donc au client (navigateur) de supporter un schéma ou non, si le schéma n'est pas supporté, le navigateur ne fait aucune interaction avec l'utilisateur. J'utilise cette approche pour le remplacement transparent de Windows SSO (SPNEGO) à un simple formulaire de connexion. BTW: ne fonctionne que de manière fiable dans Chrome + IE lors de l'accès au serveur via le nom d'hôte; n'utilisez pas d'IP. – comeGetSome