Wzorce korporacyjne dla uwierzytelniania JWT dla aplikacji opartej na REST?


9

Specyfikacja JWT opisuje tylko ładunek i sposób jego wysyłania, ale pozostawia otwarty protokół uwierzytelniania, co pozwala na elastyczność, ale niestety elastyczność może prowadzić do antypatternów i błędnego projektowania.

Szukam dobrze przemyślanego i przetestowanego modelu korporacyjnego do uwierzytelniania JWT, którego mógłbym użyć lub dostosować, ale nie udało mi się znaleźć czegoś kompletnego.

Myślałem o:

  • gdy nagłówek autoryzacji nie jest spełniony lub token JWT jest nieprawidłowy lub wygasł, wyślij HTTP 401
  • w celu uwierzytelnienia użyj / zaloguj kanał REST, wyślij nazwę użytkownika i hasło jako obiekt JSON
  • w celu utrzymania tokena przy użyciu, użyj / utrzymuj kanał REST, wywoływaj go co N (5) minut, otrzymuj nowy token JWT i zastępuj istniejący po każdym połączeniu (token wygasa po M (15) minutach)

Jednak niepokoi mnie konieczność tego kanału / keepalive. Z drugiej strony zmusza mnie do zapobiegania wygaśnięciu uwierzytelnienia, nawet jeśli nie ma użytkownika (decyzja, czy chcemy zachować aktywność, nie jest jeszcze spełniona) i oczywiście są to dodatkowe połączenia i dodatkowe komplikacje protokołu. Interesujące byłoby to, że serwer automatycznie przedłuża token. W środowisku opartym na sesjach dzieje się to przez zresetowanie znacznika czasu, tutaj jednak serwer musiałby wysyłać nowy token, może nie za każdym razem, ale gdy token wygaśnie za R (powiedzmy 10) minut. Ale umieszczenie go w treści odpowiedzi oznaczałoby zmodyfikowanie protokołu odpowiedzi JSON (dlatego rozwiązanie jest inwazyjne i nieprzejrzyste), a umieszczenie dodatkowego nagłówka HTTP, który klient może przetworzyć, niekoniecznie musi być dobrym wzorcem. JA'

Czy są jakieś gotowe wzorce korporacyjne, które odpowiadają moim otwartym punktom? Czy mój projekt protokołu jest wiarygodnym pomysłem? Wolałbym użyć czegoś gotowego niż projekt od zera.


1
Tak. JWT doprowadził wiele osób do wdrożenia „protokołów” z własnej produkcji i odrzucenia sprawdzonego kodu ramowego. Aby znaleźć właściwe rozwiązanie, ważne będzie jasne określenie wymagań. Wygląda na to, że wygasa sesja. Czy wymuszone wylogowanie jest wymagane? tzn. gdy ktoś po stronie serwera może powiedzieć, wyloguj tego użytkownika lub użytkownik może powiedzieć, że wyloguj wszystkie moje sesje.
joshp

Odpowiedzi:


4

JWT ( Intro to JSON Web Token ) to tylko format tokenu, uwierzytelnianie to coś zupełnie poza zakresem tej specyfikacji. Jest to rzeczywiście powszechnie stosowane w systemach uwierzytelniania, ale można go również użyć w zupełnie innych scenariuszach, więc sensowne jest, aby nie uwzględniać ograniczeń specyficznych dla uwierzytelniania w tej specyfikacji.

Jeśli szukasz wskazówek dotyczących uwierzytelniania, zapoznaj się ze specyfikacją rodziny OpenID Connect . Dodatkowo, jeśli twój system składa się z API HTTP i jesteś zainteresowany zapewnieniem delegowanego dostępu do tych API do własnej lub zewnętrznej aplikacji klienckiej, powinieneś zapoznać się ze specyfikacją OAuth 2.0 .

Istnieją dodatkowe protokoły związane z uwierzytelnianiem, takie jak SAML i WS-Federation, które są nadal szeroko stosowane w scenariuszach korporacyjnych, ale ich wdrożenie jest znacznie bardziej skomplikowane.

O twoich konkretnych otwartych punktach:

  • Schemat uwierzytelniania tokenu nośnika jest zdefiniowany w dokumencie RFC 6750, który zawiera instrukcje dotyczące wykonywania żądań i możliwych kodów błędów .
  • OAuth2 i OpenID Connect rozważają możliwość i określają sposób wymiany nazwy użytkownika / hasła na token.
  • Problem przedłużenia czasu życia samodzielnego tokena / wartości (JWT) rozwiązano w OpenID Connect i OAuth2 za pomocą tokenów odświeżania .

Mimo że OAuth2 i OpenID Connect można postrzegać jako łatwiejsze do wdrożenia niż niektóre z jego poprzedników, są one na tyle złożone, że wymagają pewnej ostrożności i wdrażają je samodzielnie, jeśli chcesz poświęcić znaczną ilość czasu i zasobów. Zasadniczo jest to lepsza opcja korzystania z bibliotek lub usług stron trzecich, które wykonują to za Ciebie.

Wreszcie, protokoły te obejmują wiele scenariuszy, więc w niektórych sytuacjach mogą być nadmierne.


2
+1 za uzasadnienie ostrożności i pełną odpowiedź na dorozumiane pytanie zamiast pisemnego.
Paul

3

Nie sądzę, że potrzebujesz kanału podtrzymującego. Twoja ładowność może (i zaleca się) zawierać informacje o wygaśnięciu dostarczone przez serwer (w expkluczu, zgodnie ze standardem ), gdy token jest generowany podczas logowania. Jeśli używany jest wygasły token (który oczywiście jest określany przez serwer, który ufa tylko temu, co znajduje się w tokenie, jeśli podpis zostanie zatwierdzony), serwer po prostu odrzuca go za pomocą protokołu HTTP 401, zachęcając klienta do ponownej autoryzacji.

Tymczasem klienci mogą być proaktywni. Sekcja ładunku nie jest szyfrowana, a ponieważ klient może ją odczytać, może ustalić, kiedy żądanie zostanie wysłane z wygasłym tokenem, a zatem zadzwonić /loginponownie, jeśli token wygasł.

Alternatywnie, REST pozwala na wysyłanie informacji o hipermediach jako „silnik stanu”, więc jeśli chcesz, możesz faktycznie zrobić JWT jednorazowego użytku, a także z wygaśnięciem. Każde żądanie generowałoby nowy JWT, który jest zwracany w odpowiedzi do klienta, albo w treści, albo bardziej prawdopodobne w nagłówku odpowiedzi, jak robi to hapi-auth-jwt2 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.