Comment empêcher le navigateur d'invoquer le popup d'auth de base et de gérer l'erreur 401 en utilisant Jquery?
je dois envoyer une demande d'autorisation en utilisant l'autorisation de base. J'ai mis en œuvre avec succès cette solution en utilisant jquery. Cependant, lorsque j'obtiens 401 erreur basic auth browser popup est ouvert et jquery ajax erreur callback n'est pas appelé.
10 réponses
je faisais face à cette question récemment, aussi. Puisque vous ne pouvez pas changer le comportement par défaut du navigateur d'afficher le popup dans le cas d'une 401
( basic ou digest authentification), il y a deux façons de corriger cela:
- changez la réponse du serveur pour ne pas retourner un
401
. Retournez un code200
à la place et manipulez-le dans votre client jQuery. -
changement la méthode que vous utilisez pour l'autorisation d'une valeur personnalisée dans votre en-tête. Les navigateurs afficheront le popup pour Basic et Digest . Vous devez changer ce sur le client et le serveur.
headers : { "Authorization" : "BasicCustom" }
Veuillez également prendre un coup d'oeil à ce pour un exemple d'utilisation de jQuery avec l'Authentification Basique.
renvoie un code de statut 400 générique, puis traite ce côté client.
ou vous pouvez garder la 401, et ne pas retourner L'en-tête WWW-Authenticate, qui est vraiment ce à quoi le navigateur répond avec le popup d'authentification. Si L'en-tête WWW-Authenticate est manquant, alors le navigateur ne demandera pas d'informations d'identification.
vous pouvez supprimer le popup d'auth de base avec l'url de requête ressemblant à ceci:
https://username:password@example.com/admin/...
si vous obtenez une erreur 401 (nom d'utilisateur ou mot de passe erroné), elle sera traitée correctement avec jquery error callback. Il peut causer des problèmes de sécurité (en cas de protocole http au lieu de https), mais il fonctionne.
UPD: Cette solution support sera supprimé dans Chrome 59
comme d'autres l'ont fait remarquer, la seule façon de modifier le comportement du navigateur est de s'assurer que la réponse ne contient pas de code d'état 401 ou, si c'est le cas, de ne pas inclure l'en-tête WWW-Authenticate: Basic
. Puisque changer le code d'état n'est pas très sémantique et indésirable, une bonne approche consiste à supprimer l'en-tête WWW-Authenticate
. Si vous ne pouvez pas ou ne voulez pas modifier votre application Web server, vous pouvez toujours la servir ou la proxy via Apache (si vous n'utilisez pas déjà Apache).
voici une configuration pour Qu'Apache réécrive la réponse pour supprimer L'en-tête IFF WWW-Authenticate la requête contient l'en-tête X-Requested-With: XMLHttpRequest
(qui est défini par défaut par les cadres Javascript majeurs tels que JQuery/AngularJS, etc...) Et la réponse contient l'en-tête WWW-Authenticate: Basic
.
testé sur Apache 2.4 (pas sûr qu'il fonctionne avec 2.2).
Cela dépend du module mod_headers
installé.
(Sur Debian / Ubuntu, sudo a2enmod headers
et redémarrez Apache)
<Location />
# Make sure that if it is an XHR request,
# we don't send back basic authentication header.
# This is to prevent the browser from displaying a basic auth login dialog.
Header unset WWW-Authenticate "expr=req('X-Requested-With') == 'XMLHttpRequest' && resp('WWW-Authenticate') =~ /^Basic/"
</Location>
utilisez X-Requested-avec: XMLHttpRequest avec votre en-tête de requête. Ainsi, L'en-tête de la réponse ne contiendra pas WWW-Authenticate: Basic.
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', ("Basic "
.concat(btoa(key))));
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
},
si vous utilisez un serveur IIS, vous pouvez configurer IIS URL Rewriting (v2) pour réécrire l'en-tête WWW-Authentication
en None
sur L'URL demandée.
la valeur que vous voulez changer est response_www_authenticate
.
si vous avez besoin de plus d'informations, Ajouter un commentaire et je vais poster le web.fichier de configuration.
alternativement, si vous pouvez personnaliser la réponse de votre serveur, vous pouvez retourner un 403 Forbidden.
le navigateur n'ouvrira pas le popup d'authentification et le rappel jquery sera appelé.
si L'en-tête WWW-Authenticate est supprimé, alors vous n'obtiendrez pas la mise en cache des informations d'identification et ne récupérerez pas l'en-tête D'autorisation dans la requête. Cela signifie que vous devez maintenant entrer les informations d'identification pour chaque nouvelle demande que vous générez.
dans Safari, vous pouvez utiliser des requêtes synchrones pour éviter le navigateur pour afficher le popup. Bien sûr, les requêtes synchrones ne doivent être utilisées que dans ce cas pour vérifier les informations d'identification de l'utilisateur... Vous pouvez utiliser une telle requête avant d'envoyer la requête réelle qui peut causer une mauvaise expérience utilisateur si le contenu (envoyé ou reçu) est assez lourd.
var xmlhttp=new XMLHttpRequest;
xmlhttp.withCredentials=true;
xmlhttp.open("POST",<YOUR UR>,false,username,password);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
créer une url / login, que d'accepter les paramètres" utilisateur "et" mot de passe " via GET et ne nécessite pas l'autorisation de base. Ici, utilisez php, node, java, n'importe quoi et analysez votre fichier passwd et faites correspondre les paramètres (user/pass) avec. S'il y a une correspondance, redirigez vers http://user:pass@domain.com/ (cela définira les justificatifs d'identité sur votre navigateur) sinon, envoyez réponse 401 (sans en-tête WWW-Authenticate).