Comment empêcher le navigateur d'invoquer l'authentification authentique de base et gérer l'erreur 401 en utilisant Jquery?

J'ai besoin d'envoyer une demande d'autorisation en utilisant authentification de base. J'ai implémenté avec succès jquery. Cependant, lorsque je reçois 401 erreur, le navigateur d'authentification de base est ouvert et le rappel d'erreur jquery ajax n'est pas appelé.

    J'étais déjà confronté à cette question récemment. Étant donné que vous ne pouvez pas modifier le comportement par défaut du navigateur pour afficher le popup en cas de 401 (authentification basique ou digeste ), il existe deux façons de résoudre ceci:

    • Changez la réponse du serveur pour ne pas renvoyer un 401. Retournez un code 200 et gérez-le dans votre client jQuery.
    • Changez la méthode que vous utilisez pour l'autorisation d'une valeur personnalisée dans votre en-tête. Les navigateurs afficheront la fenêtre contextuelle pour Basic and Digest . Vous devez modifier cela sur le client et le serveur.

      En-têtes: {"Autorisation": "BasicCustom"}

    Veuillez également jeter un oeil à ceci pour un exemple d'utilisation de jQuery avec Basic Auth.

    Renvoyez un code d'état 400 générique, puis procédez à ce côté client.

    Ou vous pouvez conserver le 401, et ne pas renvoyer l'en-tête WWW-Authenticate, qui est vraiment ce que le navigateur répond avec le menu contextuel d'authentification. Si l'en-tête WWW-Authenticate est manquant, le navigateur ne demandera pas les informations d'identification.

    Vous pouvez supprimer l'authentification d'authentification basique avec l'url de requête qui ressemble à ceci:

     https://username:[email protected]/admin/... 

    Si vous obtenez une erreur 401 (un nom d'utilisateur ou un mot de passe incorrect), il sera correctement traité avec le rappel de l'erreur jquery. Cela peut causer des problèmes de sécurité (dans le cas du protocole http au lieu de https), mais il fonctionne.

    UPD: ce support de solution sera supprimé dans Chrome 59

    Comme d'autres l'ont souligné, la seule façon de modifier le comportement du navigateur est de s'assurer que la réponse ne contient pas un code d'état 401 ou, si elle le fait, ne comprend pas l'en WWW-Authenticate: Basic tête WWW-Authenticate: Basic . Comme la modification du code d'état n'est pas très sémantique et indésirable, une bonne approche consiste à supprimer l'en WWW-Authenticate tête WWW-Authenticate . Si vous ne pouvez ou ne souhaitez pas modifier votre application de serveur Web, vous pouvez toujours l'utiliser ou l'utiliser via Apache (si vous n'utilisez pas déjà Apache).

    Voici une configuration pour que Apache réécrie la réponse pour supprimer l'en-tête WWW-Authenticate IFF que la requête contient contient l'en-tête X-Requested-With: XMLHttpRequest (qui est défini par défaut par des frameworks Javascript généraux 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 si cela fonctionne avec 2.2). Cela repose sur le module mod_headers cours d'installation. (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> 

    Sinon, si vous pouvez personnaliser votre réponse du serveur, vous pouvez renvoyer un 403 Forbidden.

    Le navigateur n'ouvrira pas le popup d'authentification et le rappel de jquery sera appelé.

    Utilisez X-Requis avec: XMLHttpRequest avec votre en-tête de demande. Ainsi, l'en-tête de 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 WWW-Authentication tête WWW-Authentication à None sur l'URL demandée.

    Guide ici .

    La valeur que vous souhaitez modifier est response_www_authenticate .

    Si vous avez besoin de plus d'informations, ajoutez un commentaire et je publierai le fichier web.config.

    Si l'en-tête WWW-Authenticate est supprimé, vous ne recevrez pas la mise en cache des informations d'identification et ne récupérera pas l'en-tête de l'autorisation sur demande. Cela signifie que vous devrez entrer les informations d'identification pour chaque nouvelle demande que vous générez.

    Effectuez une / login url, que d'accepter les paramètres "utilisateur" et "mot de passe" via GET et ne nécessitent pas d'authentification de base. Ici, utilisez php, node, java, quoi que ce soit et analysez votre fichier passwd et combinez les paramètres (user / pass) contre celui-ci. S'il y a une correspondance, redirigez vers http: // user: [email protected]/ (cela définira les informations d'identification sur votre navigateur) sinon, envoyez la réponse 401 (sans l'en-tête WWW-Authenticate).