Próbuję utworzyć podstawowe uwierzytelnianie za pomocą przeglądarki, ale tak naprawdę nie mogę tego zrobić.
Jeśli skryptu tu nie będzie, uwierzytelnienie przeglądarki przejmie, ale chcę powiedzieć przeglądarce, że użytkownik zamierza dokonać uwierzytelnienia.
Adres powinien być podobny do:
http://username:[email protected]/
Mam formularz:
<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>
I skrypt:
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
Patrioticcow
źródło
źródło
Odpowiedzi:
Użyj
beforeSend
wywołania zwrotnego jQuery, aby dodać nagłówek HTTP z informacjami uwierzytelniającymi:źródło
beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); };
działa dla mnieJak rzeczy się zmieniają w ciągu roku. Oprócz atrybutu nagłówka zamiast
xhr.setRequestHeader
bieżącego jQuery (1.7.2+) zawiera nazwę użytkownika i hasło do$.ajax
wywołania.EDYCJA na podstawie komentarzy i innych odpowiedzi: Aby być jasnym - w celu prewencyjnego wysłania uwierzytelnienia bez
401 Unauthorized
odpowiedzi, zamiastsetRequestHeader
(przed -1.7) użyj'headers'
:źródło
username
i nieuser
? Nie jest to dokładnie to samo: z internetowych dokumentów i z mojego doświadczenia wynika, że nie jest to zapobiegawcze, jak wymagają niektóre interfejsy API. Innymi słowy, wysyłaAuthorization
nagłówek tylko wtedy, gdy zwracany jest kod 401.Użyj wywołania zwrotnego beforeSend, aby dodać nagłówek HTTP z informacjami uwierzytelniającymi:
źródło
Lub po prostu użyj właściwości nagłówków wprowadzonej w 1.5:
Odniesienie: jQuery Ajax API
źródło
Powyższe przykłady są nieco mylące i jest to prawdopodobnie najlepszy sposób:
Wziąłem powyższe z kombinacji odpowiedzi Rico i Yossi.
Btoa funkcja Base64 koduje łańcuch.
źródło
$.ajaxSetup()
mówi: „Ustaw wartości domyślne dla przyszłych żądań Ajax. Jego użycie nie jest zalecane. ”Jak sugerują inni, możesz ustawić nazwę użytkownika i hasło bezpośrednio w wywołaniu Ajax:
LUB użyj właściwości headers, jeśli nie chcesz przechowywać poświadczeń w postaci zwykłego tekstu:
Bez względu na to, jak go wyślesz, serwer musi być bardzo uprzejmy. W przypadku Apache plik .htaccess powinien wyglądać mniej więcej tak:
Wyjaśnienie:
W przypadku niektórych żądań między domenami przeglądarka wysyła żądanie OPTIONS inspekcji wstępnej, w którym brakuje nagłówków uwierzytelniania. Zawiń dyrektywy uwierzytelniania w tagu LimitExcept, aby poprawnie reagować na inspekcję wstępną .
Następnie wyślij kilka nagłówków, aby poinformować przeglądarkę, że może się uwierzytelnić, a Access-Control-Allow-Origin, aby udzielić zgody na żądanie między witrynami.
W niektórych przypadkach symbol wieloznaczny * nie działa jako wartość kontroli dostępu-Allow-Origin: musisz zwrócić dokładną domenę odbiorcy. Użyj SetEnvIf, aby przechwycić tę wartość.
źródło
Użyj funkcji jQuery ajaxSetup , która może ustawić wartości domyślne dla wszystkich żądań ajax.
źródło
JSONP nie działa z podstawowym uwierzytelnianiem, więc wywołanie zwrotne jQuery beforeSend nie będzie działać z JSONP / Script.
Udało mi się obejść to ograniczenie, dodając do żądania użytkownika i hasło (np. Użytkownik: [email protected]). Działa to praktycznie z każdą przeglądarką oprócz Internet Explorera którym uwierzytelnianie za pomocą adresów URL nie jest obsługiwane (wywołanie po prostu nie zostanie wykonane).
Zobacz http://support.microsoft.com/kb/834489 .
źródło
Istnieją 3 sposoby osiągnięcia tego, jak pokazano poniżej
Metoda 1:
Metoda 2:
Metoda 3:
źródło
Według odpowiedzi SharkAlley działa również z Nginx.
Szukałem rozwiązania w celu uzyskania danych przez jQuery z serwera za nginx i ograniczonego przez Base Auth. To działa dla mnie:
A kod JavaScript to:
Artykuł, który uważam za użyteczny:
źródło