Muszę wysłać żądanie autoryzacji przy użyciu podstawowego uwierzytelniania. Z powodzeniem zaimplementowałem to przy użyciu jquery. Jednak gdy otrzymuję błąd 401, otwiera się wyskakujące okienko przeglądarki uwierzytelniania podstawowego i nie jest wywoływane wywołanie zwrotne błędu jquery ajax.
javascript
jquery
rest
basic-authentication
Aleksiej Zacharow
źródło
źródło
Odpowiedzi:
Ostatnio też miałem do czynienia z tym problemem. Ponieważ nie możesz zmienić domyślnego zachowania przeglądarki, polegającego na wyświetlaniu wyskakującego okienka w przypadku uwierzytelnienia
401
( podstawowego lub uproszczonego ), istnieją dwa sposoby, aby to naprawić:401
.200
Zamiast tego zwróć kod i obsłuż go w swoim kliencie jQuery.Zmień metodę, której używasz do autoryzacji, na niestandardową wartość w nagłówku. Przeglądarki wyświetlą wyskakujące okienko Basic i Digest . Musisz to zmienić zarówno na kliencie, jak i na serwerze.
Proszę również spojrzeć na to, aby zobaczyć przykład użycia jQuery z podstawowym uwierzytelnianiem.
źródło
<security:http-basic/>
, nie musisz definiować,basicAuthenticationFilter
ale powinieneś zdefiniować go jako<security:http-basic entry-point-ref="myBasicAuthenticationEntryPoint"/>
.401
iWWW-Authenticate:Bearer WWW-Authenticate:NTLM WWW-Authenticate:Negotiate
Czy wiesz, dlaczego tak sięZwróć ogólny kod stanu 400, a następnie przetwórz ten kod po stronie klienta.
Możesz też zachować 401 i nie zwracać nagłówka WWW-Authenticate, na który tak naprawdę odpowiada przeglądarka, wyświetlając wyskakujące okienko uwierzytelniania. Jeśli brakuje nagłówka WWW-Authenticate, przeglądarka nie monituje o poświadczenia.
źródło
res.removeHeader('www-authenticate'); // prevents browser from popping up a basic auth window.
Możesz ukryć wyskakujące okienko autoryzacji z adresem URL żądania wyglądającym tak:
Jeśli pojawi się błąd 401 (zła nazwa użytkownika lub hasło), zostanie to poprawnie obsłużone przez wywołanie zwrotne błędu jQuery. Może powodować pewne problemy z bezpieczeństwem (w przypadku protokołu http zamiast https), ale działa.
UPD: ta obsługa rozwiązania zostanie usunięta w Chrome 59
źródło
https://user:pass@host/
W M59 około czerwca 2017 r. Więcej informacji znajdziesz w tym poście na blogu chromestatus .Jak zauważyli inni, jedynym sposobem zmiany zachowania przeglądarki jest upewnienie się, że odpowiedź albo nie zawiera kodu stanu 401, albo jeśli zawiera, nie zawiera
WWW-Authenticate: Basic
nagłówka. Ponieważ zmiana kodu statusu nie jest zbyt semantyczna i niepożądana, dobrym podejściem jest usunięcieWWW-Authenticate
nagłówka. Jeśli nie możesz lub nie chcesz modyfikować aplikacji serwera WWW, zawsze możesz ją obsługiwać lub proxy przez Apache (jeśli nie używasz jeszcze Apache).Oto konfiguracja dla Apache do przepisania odpowiedzi w celu usunięcia nagłówka IFF WWW-Authenticate, które żądanie zawiera nagłówek
X-Requested-With: XMLHttpRequest
(który jest domyślnie ustawiany przez główne struktury Javascript, takie jak JQuery / AngularJS itp ...) ORAZ odpowiedź zawiera nagłówekWWW-Authenticate: Basic
.Testowane na Apache 2.4 (nie jestem pewien, czy działa z 2.2). Zależy to od
mod_headers
instalowanego modułu. (Na Debianie / Ubuntusudo a2enmod headers
i zrestartuj Apache)źródło
proxy_hide_header WWW-Authenticate;
Użyj X-Requested-With: XMLHttpRequest z nagłówkiem żądania. Więc nagłówek odpowiedzi nie będzie zawierał WWW-Authenticate: Basic.
źródło
Jeśli używasz serwera IIS, możesz skonfigurować przepisywanie adresów URL usług IIS (v2), aby przepisać
WWW-Authentication
nagłówekNone
na żądany adres URL.Przewodnik tutaj .
Wartość, którą chcesz zmienić, to
response_www_authenticate
.Jeśli potrzebujesz więcej informacji, dodaj komentarz, a ja opublikuję plik web.config.
źródło
Jeśli nagłówek WWW-Authenticate zostanie usunięty, nie otrzymasz buforowania poświadczeń i nie odzyskasz nagłówka Authorization w żądaniu. Oznacza to, że teraz będziesz musiał wprowadzić poświadczenia dla każdego nowego żądania, które wygenerujesz.
źródło
Alternatywnie, jeśli możesz dostosować odpowiedź serwera, możesz zwrócić 403 Forbidden.
Przeglądarka nie otworzy wyskakującego okienka uwierzytelniania i zostanie wywołane wywołanie zwrotne jquery.
źródło
W Safari możesz używać żądań synchronicznych, aby przeglądarka nie wyświetlała wyskakującego okienka. Oczywiście, żądania synchroniczne powinny być używane tylko w tym przypadku do sprawdzania danych uwierzytelniających użytkownika ... Możesz użyć takiego żądania przed wysłaniem rzeczywistego żądania, co może spowodować złe wrażenia użytkownika, jeśli zawartość (wysłana lub odebrana) jest dość ciężka.
źródło
Utwórz adres URL logowania /, a następnie zaakceptuj parametry „użytkownik” i „hasło” przez GET i nie wymagaj podstawowej autoryzacji. Tutaj użyj php, node, java, cokolwiek i przeanalizuj swój plik z hasłami i dopasuj do niego parametry (użytkownik / przepustka). Jeśli jest dopasowanie, przekieruj na http: // użytkownik: hasł[email protected]/ (spowoduje to ustawienie poświadczeń w przeglądarce), jeśli nie, wyślij odpowiedź 401 (bez nagłówka WWW-Authenticate).
źródło
Od tyłu ze Spring Boot użyłem niestandardowego BasicAuthenticationEntryPoint:
źródło