J'essaie de créer une authentification de base via 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 est sur le point de faire l'authentification.
L'adresse doit être quelque chose comme:
http://username:[email protected]/
J'ai un formulaire:
<form name="cookieform" id="login" method="post">
<input type="text" name="username" id="username" class="text"/>
<input type="password" name="password" id="password" class="text"/>
<input type="submit" name="sub" value="Submit" class="page"/>
</form>
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('Thanks for your comment!');
}
});
javascript
jquery
ajax
authentication
Vache patriotique
la source
la source
Réponses:
Utilisez le
beforeSend
rappel de jQuery pour ajouter un en-tête HTTP avec les informations d'authentification:la source
beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); };
travaille pour moiComment les choses changent en un an. En plus de l'attribut d'en-tête à la place de
xhr.setRequestHeader
, jQuery actuel (1.7.2+) inclut un attribut de nom d'utilisateur et de mot de passe avec l'$.ajax
appel.MODIFIER à partir des commentaires et autres réponses: Pour être clair - afin d'envoyer de manière préventive l'authentification sans
401 Unauthorized
réponse, au lieu d'setRequestHeader
utiliser (avant -1.7)'headers'
:la source
username
et nonuser
? De plus, ce n'est pas exactement la même chose: d'après les documents en ligne et mon expérience, il semble que ce ne soit pas préemptif comme certaines API le nécessitent. En d'autres termes, il n'envoie l'en-Authorization
tête que lorsqu'un code 401 est renvoyé.Utilisez le rappel beforeSend pour ajouter un en-tête HTTP avec les informations d'authentification comme ceci:
la source
Ou, utilisez simplement la propriété headers introduite en 1.5:
Référence: API jQuery Ajax
la source
Les exemples ci-dessus sont un peu déroutants, et c'est probablement la meilleure façon:
J'ai pris ce qui précède d'une combinaison de Rico et de la réponse de Yossi.
La fonction btoa Base64 code une chaîne.
la source
$.ajaxSetup()
dit "Définir des valeurs par défaut pour les futures demandes Ajax. Son utilisation n'est pas recommandée. "Comme d'autres l'ont suggéré, vous pouvez définir le nom d'utilisateur et le mot de passe directement dans l'appel Ajax:
OU utilisez la propriété headers si vous préférez ne pas stocker vos informations d'identification en texte brut:
Quelle que soit la façon dont vous l'envoyez, le serveur doit être très poli. Pour Apache, votre fichier .htaccess devrait ressembler à ceci:
Explication:
Pour certaines demandes interdomaines, le navigateur envoie une demande OPTIONS de contrôle en amont qui manque vos en-têtes d'authentification. Enveloppez vos directives d'authentification dans LimitExcept balise pour répondre correctement au contrôle en amont.
Envoyez ensuite quelques en-têtes pour indiquer au navigateur qu'il est autorisé à s'authentifier et à Access-Control-Allow-Origin d'accorder l'autorisation pour la demande intersite.
Dans certains cas, le caractère générique * ne fonctionne pas comme valeur pour Access-Control-Allow-Origin: vous devez renvoyer le domaine exact de l'appelé. Utilisez SetEnvIf pour capturer cette valeur.
la source
Utilisez la fonction jQuery ajaxSetup , qui peut définir des valeurs par défaut pour toutes les demandes ajax.
la source
JSONP ne fonctionne pas avec l'authentification de base, donc le rappel jQuery beforeSend ne fonctionnera pas avec JSONP / Script.
J'ai réussi à contourner cette limitation en ajoutant l'utilisateur et le mot de passe à la demande (par exemple utilisateur: [email protected]). Cela fonctionne avec à peu près n'importe quel navigateur sauf Internet Explorer où l'authentification via les URL n'est pas prise en charge (l'appel ne sera tout simplement pas exécuté).
Voir http://support.microsoft.com/kb/834489 .
la source
Il existe 3 façons d'y parvenir, comme indiqué ci-dessous
Méthode 1:
Méthode 2:
Méthode 3:
la source
Selon la réponse de SharkAlley, cela fonctionne aussi avec nginx.
Je cherchais une solution pour obtenir des données par jQuery à partir d'un serveur derrière nginx et restreint par Base Auth. Cela fonctionne pour moi:
Et le code JavaScript est:
Article que je trouve utile:
la source