Jaki jest prawidłowy sposób wylogowania się z folderu chronionego uwierzytelnianiem HTTP?
Istnieją obejścia, które mogą to osiągnąć, ale są one potencjalnie niebezpieczne, ponieważ mogą zawierać błędy lub nie działać w niektórych sytuacjach / przeglądarkach. Dlatego szukam poprawnego i czystego rozwiązania.
php
authentication
.htaccess
http-headers
password-protection
Josef Sábl
źródło
źródło
Miscellaneous -> Clear Private Data -> HTTP Authentication
Odpowiedzi:
Mu. Nie istnieje poprawny sposób , nawet taki, który byłby spójny w różnych przeglądarkach.
To jest problem, który wynika ze specyfikacji HTTP (sekcja 15.6):
Z drugiej strony, sekcja 10.4.2 mówi:
Innymi słowy, możesz być w stanie ponownie wyświetlić okno logowania (jak mówi @Karsten ), ale przeglądarka nie musi honorować twojego żądania - więc nie polegaj zbytnio na tej (niewłaściwej) funkcji.
źródło
Metoda, która działa dobrze w Safari. Działa również w Firefoksie i Operze, ale z ostrzeżeniem.
Mówi to przeglądarce, aby otworzyła adres URL z nową nazwą użytkownika, zastępując poprzednią.
źródło
user:password@host
jest przestarzałe. Używanie samego tylkohttp://[email protected]/
nie jest i powinno działać w większości przypadków.Prosta odpowiedź jest taka, że nie można niezawodnie wylogować się z uwierzytelniania http.
Długa odpowiedź:
Http-auth (podobnie jak reszta specyfikacji HTTP) ma być bezstanowe. Zatem bycie „zalogowanym” lub „wylogowanym” nie jest tak naprawdę koncepcją, która ma sens. Lepszym sposobem, aby to zobaczyć, jest pytanie, przy każdym żądaniu HTTP (pamiętaj, że ładowanie strony to zwykle wiele żądań) „czy możesz zrobić to, o co prosisz?”. Serwer postrzega każde żądanie jako nowe i niezwiązane z żadnymi wcześniejszymi żądaniami.
Przeglądarki zdecydowały się zapamiętywać dane uwierzytelniające, które podajesz im w pierwszym 401, i wysyłać je ponownie bez wyraźnej zgody użytkownika na kolejne żądania. Jest to próba pokazania użytkownikowi modelu "zalogowania / wylogowania", jakiego oczekują, ale jest to czysta kludge. To przeglądarka symuluje tę trwałość stanu. Serwer sieciowy jest tego całkowicie nieświadomy.
Tak więc „wylogowanie” w kontekście http-auth jest czystą symulacją zapewnianą przez przeglądarkę, a więc poza władzą serwera.
Tak, są kludges. Ale łamią RESTful-ness (jeśli jest to dla ciebie wartościowe) i są zawodne.
Jeśli absolutnie potrzebujesz modelu zalogowania / wylogowania do uwierzytelnienia swojej witryny, najlepszym rozwiązaniem jest śledzący plik cookie, z trwałością stanu przechowywanego w jakiś sposób na serwerze (mysql, sqlite, flatfile itp.). Będzie to wymagało oceny wszystkich żądań, na przykład za pomocą PHP.
źródło
Obejście problemu
Możesz to zrobić za pomocą Javascript:
To, co zostało zrobione powyżej, to:
dla IE - po prostu wyczyść pamięć podręczną uwierzytelniania i przekieruj gdzieś
w przypadku innych przeglądarek - wyślij zakulisowe żądanie XMLHttpRequest z nazwą logowania i hasłem „wylogowania”. Musimy wysłać go na jakąś ścieżkę, która zwróci 200 OK na to żądanie (tj. Nie powinno wymagać uwierzytelnienia HTTP).
Zastąp
'/where/to/redirect'
jakąś ścieżką do przekierowania po wylogowaniu się i zastąp'/path/that/will/return/200/OK'
jakąś ścieżką w swojej witrynie, która zwróci 200 OK.źródło
Obejście problemu (nie jest to czyste, ładne (lub nawet działające! Zobacz komentarze) rozwiązanie):
Jednokrotnie wyłącz jego poświadczenia.
Możesz przenieść logikę uwierzytelniania HTTP do PHP, wysyłając odpowiednie nagłówki (jeśli nie jesteś zalogowany):
I parsowanie danych wejściowych za pomocą:
Dlatego jednorazowe wyłączenie jego danych uwierzytelniających powinno być trywialne.
źródło
Wyloguj się z HTTP Basic Auth w dwóch krokach
Załóżmy, że mam dziedzinę uwierzytelniania podstawowego HTTP o nazwie „Ochrona hasłem”, a Robert jest zalogowany. Aby się wylogować, wykonuję 2 żądania AJAX:
WWW-Authenticate: Basic realm="Password protected"
W tym momencie przeglądarka zapomniała danych logowania Boba.
źródło
Moje rozwiązanie problemu jest następujące. Możesz znaleźć tę funkcję
http_digest_parse
,$realm
aw$users
drugim przykładzie tej strony: http://php.net/manual/en/features.http-auth.php .źródło
Zwykle, gdy przeglądarka poprosi użytkownika o dane uwierzytelniające i poda je do określonej witryny internetowej, będzie to robić bez dalszych monitów. W przeciwieństwie do różnych sposobów usuwania plików cookie po stronie klienta, nie znam podobnego sposobu, aby poprosić przeglądarkę o zapomnienie dostarczonych danych uwierzytelniających.
źródło
Trac - domyślnie - również używa uwierzytelniania HTTP. Wylogowanie nie działa i nie można go naprawić:
Od: http://trac.edgewall.org/ticket/791#comment:103
Wygląda na to, że nie ma działającej odpowiedzi na to pytanie, problem został zgłoszony siedem lat temu i ma to sens: HTTP jest bezstanowe. Żądanie jest realizowane z poświadczeniami uwierzytelniającymi lub nie. Ale to kwestia tego, że klient wysyła żądanie, a nie serwer, który je otrzymuje. Serwer może tylko powiedzieć, czy identyfikator URI żądania wymaga autoryzacji, czy nie.
źródło
Musiałem zresetować autoryzację .htaccess, więc użyłem tego:
Znalazłem go tutaj: http://php.net/manual/en/features.http-auth.php
Domyśl.
Wiele rozwiązań znajduje się na tej stronie, a nawet zauważa na dole: Lynx, nie czyści autoryzacji tak jak inne przeglądarki;)
Przetestowałem to na moich zainstalowanych przeglądarkach i po zamknięciu wydaje się, że każda przeglądarka konsekwentnie wymaga ponownego uwierzytelnienia przy ponownym wejściu.
źródło
WWW-Authenticate
było przyczyną problemu, pozbycie się tego automatycznie wylogowało mnie.WWW-Authenticate
podczas naprawiania problemu w jednej przeglądarce (Chrome) powoduje, że inna przeglądarka (Firefox) zapamiętuje dane uwierzytelniające i wyśle je przy następnym żądaniu, co skutkuje automatycznym ponownym zalogowaniem! Argh!Może to nie jest rozwiązanie, którego szukałem, ale rozwiązałem to w ten sposób. Mam 2 skrypty do procesu wylogowania.
logout.php
log.php
W ten sposób nie dostaję ostrzeżenia i moja sesja zostanie zakończona
źródło
AFAIK, nie ma prostego sposobu na zaimplementowanie funkcji „wylogowania” podczas korzystania z uwierzytelniania htaccess (tj. Opartego na protokole HTTP).
Dzieje się tak, ponieważ takie uwierzytelnianie wykorzystuje kod błędu HTTP „401”, aby poinformować przeglądarkę, że wymagane są poświadczenia, po czym przeglądarka pyta użytkownika o szczegóły. Od tego momentu, dopóki przeglądarka nie zostanie zamknięta, zawsze będzie wysyłać dane uwierzytelniające bez dalszych monitów.
źródło
Najlepszym rozwiązaniem, jakie do tej pory znalazłem, jest (jest to rodzaj pseudokodu, czyli
$isLoggedIn
pseudo zmienna is dla uwierzytelniania http):W momencie "wylogowania" po prostu zapisz do sesji informację, że użytkownik jest faktycznie wylogowany.
W miejscu, w którym sprawdzam uwierzytelnienie rozszerzam warunek:
Sesja jest w pewnym stopniu powiązana ze stanem uwierzytelniania http, więc użytkownik pozostaje wylogowany, o ile ma otwartą przeglądarkę i tak długo, jak uwierzytelnianie HTTP utrzymuje się w przeglądarce.
źródło
Może nie rozumiem.
Najbardziej niezawodny sposób zakończenia uwierzytelniania HTTP to zamknięcie przeglądarki i wszystkich okien przeglądarki. Możesz zamknąć okno przeglądarki za pomocą Javascript, ale nie sądzę, że możesz zamknąć wszystkie okna przeglądarki.
źródło
Jedynym skutecznym sposobem, w jaki udało mi się usunąć dane uwierzytelniające
PHP_AUTH_DIGEST
lubPHP_AUTH_USER
ANDPHP_AUTH_PW
, jest wywołanie nagłówkaHTTP/1.1 401 Unauthorized
.źródło
Podczas gdy inni mają rację mówiąc, że niemożliwe jest wylogowanie się z podstawowego uwierzytelniania HTTP, istnieją sposoby implementacji uwierzytelniania, które zachowują się podobnie. Jednym z oczywistych appeoach jest użycie auth_memcookie . Jeśli naprawdę chcesz zaimplementować podstawowe uwierzytelnianie HTTP (tj. Użyj okien dialogowych przeglądarki do logowania zamiast formularza HTTP) używając tego - po prostu ustaw uwierzytelnianie na oddzielny chroniony katalog .htaccess zawierający skrypt PHP, który przekierowuje z powrotem tam, gdzie przyszedł użytkownik tworzenie sesji memcache.
źródło
Jest tu wiele świetnych - złożonych - odpowiedzi. W moim konkretnym przypadku znalazłem czystą i prostą poprawkę do wylogowania. Jeszcze nie testowałem w Edge. Na mojej stronie, na której się zalogowałem, umieściłem link do wylogowania podobny do tego:
A w nagłówku tej strony logout.html (która jest również chroniona przez .htaccess) mam odświeżenie strony podobne do tego:
Miejsce, w którym pozostawisz słowa „wyloguj się”, aby wyczyścić nazwę użytkownika i hasło zapisane w pamięci podręcznej witryny.
Przyznam, że gdyby wiele stron musiało być bezpośrednio zalogowanych od samego początku, każdy z tych punktów wejścia musiałby mieć własną stronę logout.html. W przeciwnym razie możesz scentralizować wylogowanie, wprowadzając dodatkowy krok strażnika do procesu przed właściwym monitem logowania, wymagający wprowadzenia frazy, aby dotrzeć do miejsca docelowego logowania.
źródło