Pomożesz mi to zrozumieć? "Częste błędy w odpoczynku: sesje są nieistotne"

Disclaimer: jestem nowy w szkole myśli REST, i staram się owinąć mój umysł wokół niego.

Więc, czytam tę stronę, Częste błędy odpoczynku , i odkryłem, że jestem całkowicie zdumiony tym, że sekcja o sesjach jest nieistotna. Tak jest napisane na stronie:

Nie powinno być potrzeby klienta aby "zalogować się" lub " rozpocząć połączenie." Uwierzytelnianie HTTP zakończone automatycznie przy każdej wiadomości. Klient aplikacje są konsumentami zasoby, nie usługi. Dlatego nie ma do czego się logować! Let ' s powiedz, że rezerwujesz lot na Serwis internetowy REST. Nie tworzysz nowe połączenie "sesji" z obsługa. Raczej zapytać " plan podróży creator object " aby utworzyć nowy plan podróży. Możesz zacząć wypełniać ślepaki, ale potem dostać zupełnie inny komponent gdzie indziej na www, aby wypełnić inne puste pola. Nie ma sesji więc nie ma problem migracji stanu sesji między klientami. Nie ma też wydanie "powinowactwa sesyjnego" w serwer (choć nadal są ładowane Bilansowanie problemów do kontynuowania).

Ok, rozumiem, że uwierzytelnianie HTTP odbywa się automatycznie na każdej wiadomości - ale jak? Czy nazwa użytkownika / hasło jest wysyłane przy każdym żądaniu? Czy to nie zwiększa powierzchni ataku? Czuję, że brakuje mi części układanki.

Czy byłoby źle mieć usługę odpoczynku, powiedzmy, /session, która akceptuje żądanie GET, gdzie można przejść w nazwa użytkownika/hasło jako część żądania i zwraca token sesji, jeśli uwierzytelnienie się powiodło, który może być następnie przekazany wraz z kolejnymi żądaniami? Czy to ma sens z punktu widzenia odpoczynku, czy to nie ma sensu?

 152
Author: Brad Mace, 2009-02-13

6 answers

Aby być RESTful, każde żądanie HTTP powinno zawierać wystarczająco dużo informacji, aby jego odbiorca mógł je przetworzyć, aby było w pełnej harmonii z bezpaństwową naturą HTTP.

Ok, rozumiem to uwierzytelnianie HTTP odbywa się automatycznie przy każdej wiadomości - ale jak?

Tak, Nazwa użytkownika i hasło są wysyłane przy każdym żądaniu. Typowe metody to podstawowe uwierzytelnianie dostępu i digest access authentication . I tak, an podsłuchiwacz może przechwycić dane uwierzytelniające użytkownika. W ten sposób można zaszyfrować wszystkie dane wysyłane i odbierane za pomocą Transport Layer Security (TLS).

Czy byłoby źle odpocząć serwis, powiedzmy, / sesja, która akceptuje Pobierz wniosek, gdzie można przejść w nazwa użytkownika/hasło w ramach żądania i zwraca token sesji jeśli uwierzytelnianie przebiegło pomyślnie, które można następnie przekazać wraz z kolejne prośby? Czy to sprawia, że sens z punktu spoczynku Widok, czy jest to nie ma sensu?

Nie byłoby to RESTful , ponieważ niesie ze sobą stan, ale jest to dość powszechne, ponieważ jest to wygoda dla użytkowników; użytkownik nie musi się logować za każdym razem.

To, co opisujesz w "tokenie sesji", jest powszechnie określane jako plik cookie logowania. Na przykład, jeśli spróbujesz zalogować się do Yahoo! konto tam jest pole wyboru, które mówi "keep me logged in for 2 weeks". To jest zasadniczo powiedzenie (w twoich słowach) " zachować mój token sesji żyje przez 2 tygodnie, jeśli zaloguję się pomyślnie."Przeglądarki internetowe wysyłają takie pliki cookie logowania (i ewentualnie inne) przy każdym żądaniu HTTP, o które prosisz.

 77
Author: z8000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 02:43:24

Często zdarza się, że usługa REST wymaga uwierzytelniania dla każdego żądania HTTP. Na przykład Amazon S3 wymaga, aby każde żądanie miało podpis, który pochodzi od poświadczeń użytkownika, dokładnego żądania do wykonania i bieżącego czasu. Podpis ten jest łatwy do obliczenia po stronie klienta, może być szybko zweryfikowany przez serwer i jest ograniczony do atakującego, który go przechwytuje (ponieważ opiera się na bieżącym czasie).

 31
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 02:33:12

Wiele osób nie rozumie zasad REST bardzo jasno, używanie tokenu sesji nie oznacza, że zawsze jesteś stateful, powodem wysyłania nazwy użytkownika/hasła przy każdym żądaniu jest tylko dla uwierzytelnienia i to samo dla wysyłania tokenu (generowanego przez proces logowania) tylko po to, aby zdecydować, czy klient ma uprawnienia do żądania danych, czy nie, naruszasz tylko konwencje REST, gdy używasz weither nazwy użytkownika/hasła lub tokenów sesji, aby zdecydować, jakie dane pokazać ! zamiast tego musisz używać ich tylko do atetyzacja (aby pokazać dane lub nie aby pokazać DANE)

W Twoim przypadku mówię tak to jest RESTy, ale spróbuj uniknąć używania natywnych sesji php w REST API i zacznij generować własne hashowane tokeny, które wygasają w określonym czasie!

 10
Author: EvilThinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-12 20:45:11

Nie, Nie o to chodzi. Google ClientLogin działa dokładnie w ten sposób, z zauważalnym wyjątkiem, że klient jest poinstruowany, aby przejść do "/sesji" za pomocą odpowiedzi HTTP 401. Ale to nie tworzy sesji, tylko tworzy sposób dla klientów, aby (tymczasowo) uwierzytelnić się bez przekazywania poświadczeń w jasny, i dla serwera, aby kontrolować ważność tych tymczasowych poświadczeń, jak uzna to za stosowne.

 8
Author: mogsie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 09:34:03

Ok, rozumiem to uwierzytelnianie HTTP odbywa się automatycznie przy każdej wiadomości - ale jak?

"Authorization:" nagłówek HTTP wysłany przez Klienta. Albo podstawowy (zwykły tekst) lub digest.

Czy byłoby źle odpocząć serwis, powiedzmy, / sesja, która akceptuje Pobierz wniosek, gdzie można przejść w nazwa użytkownika/hasło w ramach żądania i zwraca token sesji jeśli uwierzytelnianie przebiegło pomyślnie, które można następnie przekazać wraz z kolejne prośby? Czy to sprawia, że sens z punktu widzenia odpoczynku, lub jest to nie ma sensu?

Cała idea sesji polega na tworzeniu stateful aplikacji wykorzystujących protokół bezstanowy (HTTP) i dumb client (przeglądarkę internetową), utrzymując stan po stronie serwera. Jedną z pozostałych zasad jest "każdy zasób jest unikalnie adresowalny przy użyciu uniwersalnej składni do użytku w linkach hypermedia". Zmienne sesji są czymś, do czego nie można uzyskać dostępu przez URI. Truly Aplikacja RESTful utrzymywałaby stan po stronie klienta, wysyłając wszystkie niezbędne zmienne przez HTTP, najlepiej w URI.

Przykład: wyszukiwanie z paginacją. Masz URL w formie

http://server/search/urlencoded-search-terms/page_num

To ma wiele wspólnego z Bookmarkable Url

 5
Author: vartec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 15:11:56

Myślę, że Twoja sugestia jest OK, jeśli chcesz kontrolować czas życia sesji klienta. Myślę, że architektura RESTful zachęca do tworzenia aplikacji bezstanowych. Jak napisał @2pence "każde żądanie HTTP powinno zawierać wystarczająco dużo informacji, aby jego odbiorca mógł je przetworzyć, aby było w pełnej harmonii z bezpaństwową naturą HTTP" .

Jednak nie zawsze tak jest, czasami aplikacja musi powiedzieć, kiedy Klient loguje się lub wylogowuje i utrzymać zasoby takie jak blokady lub licencje oparte na tych informacjach. Zobacz moje kontynuacja pytanie dla przykładu takiego przypadku.

 3
Author: LiorH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:57