Ich versuche, eine grundlegende Authentifizierung über den Browser zu erstellen, komme aber nicht wirklich dorthin.
Wenn dieses Skript nicht hier ist, übernimmt die Browserauthentifizierung, aber ich möchte dem Browser mitteilen, dass der Benutzer die Authentifizierung durchführen wird.
Die Adresse sollte ungefähr so lauten:
http://username:[email protected]/
Ich habe ein Formular:
<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>
Und ein Drehbuch:
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
Patriotische Kühe
quelle
quelle
Antworten:
Verwenden Sie den
beforeSend
Rückruf von jQuery , um einen HTTP-Header mit den Authentifizierungsinformationen hinzuzufügen:quelle
beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); };
arbeitet für michWie sich die Dinge in einem Jahr ändern. Zusätzlich zum Header-Attribut anstelle von enthält die
xhr.setRequestHeader
aktuelle jQuery (1.7.2+) ein Benutzername- und Kennwortattribut mit dem$.ajax
Aufruf.BEARBEITEN von Kommentaren und anderen Antworten: Um klar zu sein - um die Authentifizierung präventiv ohne
401 Unauthorized
Antwort zu senden , anstattsetRequestHeader
(vor -1,7) zu verwenden'headers'
:quelle
username
und nichtuser
? Es ist auch nicht genau dasselbe: Aus den Online-Dokumenten und meiner Erfahrung nach sieht es so aus, als ob es nicht präventiv ist, wie es einige APIs erfordern. Mit anderen Worten, es sendet denAuthorization
Header nur, wenn ein Code 401 zurückgegeben wird.Verwenden Sie den beforeSend-Rückruf , um einen HTTP-Header mit folgenden Authentifizierungsinformationen hinzuzufügen:
quelle
Oder verwenden Sie einfach die in 1.5 eingeführte Eigenschaft headers:
Referenz: jQuery Ajax API
quelle
Die obigen Beispiele sind etwas verwirrend, und dies ist wahrscheinlich der beste Weg:
Ich habe das Obige einer Kombination aus Rico und Yossis Antwort entnommen.
Die btoa- Funktion Base64 codiert eine Zeichenfolge.
quelle
$.ajaxSetup()
"Festlegen von Standardwerten für zukünftige Ajax-Anforderungen. Die Verwendung wird nicht empfohlen. "Wie andere vorgeschlagen haben, können Sie den Benutzernamen und das Passwort direkt im Ajax-Aufruf festlegen:
ODER verwenden Sie die Eigenschaft headers, wenn Sie Ihre Anmeldeinformationen lieber nicht im Klartext speichern möchten:
Unabhängig davon, wie Sie es senden, muss der Server sehr höflich sein. Für Apache sollte Ihre .htaccess-Datei ungefähr so aussehen:
Erläuterung:
Bei einigen domänenübergreifenden Anforderungen sendet der Browser eine Preflight- OPTIONS- Anforderung, bei der Ihre Authentifizierungsheader fehlen. Wickeln Sie Ihre Authentifizierungsanweisungen in das LimitExcept- Tag ein, um ordnungsgemäß auf den Preflight zu reagieren.
Senden Sie dann einige Header, um dem Browser mitzuteilen, dass er sich authentifizieren darf, und die Zugriffssteuerung , die Origin zulässt , um die Berechtigung für die standortübergreifende Anforderung zu erteilen.
In einigen Fällen funktioniert der Platzhalter * nicht als Wert für Access-Control-Allow-Origin: Sie müssen die genaue Domäne des Angerufenen zurückgeben. Verwenden Sie SetEnvIf, um diesen Wert zu erfassen.
quelle
Verwenden Sie die Funktion jQuery ajaxSetup , mit der Standardwerte für alle Ajax-Anforderungen festgelegt werden können.
quelle
JSONP funktioniert nicht mit der Basisauthentifizierung, sodass der Rückruf von jQuery beforeSend nicht mit JSONP / Script funktioniert.
Ich habe es geschafft, diese Einschränkung zu umgehen, indem ich der Anforderung den Benutzer und das Kennwort hinzugefügt habe (z. B. Benutzer: [email protected]). Dies funktioniert mit so ziemlich jedem Browser außer Internet Explorer, in dem die Authentifizierung über URLs nicht unterstützt wird (der Aufruf wird einfach nicht ausgeführt).
Siehe http://support.microsoft.com/kb/834489 .
quelle
Es gibt 3 Möglichkeiten, dies zu erreichen, wie unten gezeigt
Methode 1:
Methode 2:
Methode 3:
quelle
Laut SharkAlley Antwort funktioniert es auch mit Nginx.
Ich suchte nach einer Lösung, um Daten von jQuery von einem Server hinter nginx abzurufen, der von Base Auth eingeschränkt wurde. Das funktioniert bei mir:
Und der JavaScript-Code lautet:
Artikel, den ich nützlich finde:
quelle