Wciąż próbuję znaleźć najlepsze rozwiązanie bezpieczeństwa do ochrony interfejsu API REST, ponieważ liczba aplikacji mobilnych i interfejsu API rośnie z każdym dniem.
Próbowałem różnych sposobów uwierzytelniania, ale nadal mam pewne nieporozumienia, dlatego potrzebuję porady kogoś bardziej doświadczonego.
Pozwól mi powiedzieć, jak rozumiem te wszystkie rzeczy. Jeśli coś rozumiem źle, daj mi znać.
O ile interfejs API REST jest bezstanowy, a także ogólnie WEB, musimy wysyłać niektóre dane uwierzytelniające w każdym żądaniu (pliki cookie, token ....). Znam trzy szeroko stosowane mechanizmy uwierzytelniania użytkownika
Token z HTTPS. Używałem tego podejścia wiele razy, ponieważ jest wystarczająco dobry z HTTPS. Jeśli użytkownik poda prawidłowe hasło i login, w odpowiedzi otrzyma token i użyje go do dalszych żądań. Token jest generowany przez serwer i przechowywany, na przykład w tabeli osobno lub w tym samym miejscu, w którym przechowywane są informacje o użytkowniku. Tak więc dla każdego żądania serwer sprawdza, czy użytkownik ma token i czy jest taki sam jak w bazie danych. Wszystko jest bardzo proste.
Token JWT. Ten token jest opisowy, zawiera wszystkie niezbędne informacje o samym tokenie, użytkownik nie może zmienić na przykład daty ważności ani żadnego innego roszczenia, ponieważ ten token jest generowany (podpisany) przez serwer za pomocą tajnego słowa kluczowego. To również jasne. Ale jeden duży problem, osobiście dla mnie, jak unieważnić token.
OAuth 2. Nie rozumiem, dlaczego takie podejście powinno być stosowane, gdy komunikacja jest ustanawiana bezpośrednio między serwerem a klientem. O ile rozumiem, serwer OAuth służy do wydawania tokena z ograniczonym zakresem, aby umożliwić innym aplikacjom dostęp do informacji o użytkowniku bez przechowywania hasła i loginu. To świetne rozwiązanie dla sieci społecznościowych, gdy użytkownik chce się zarejestrować na jakiejś stronie, serwer może poprosić o uprawnienia do uzyskania informacji o użytkowniku, na przykład z Twittera lub Facebooka, i wypełnić pola rejestracyjne danymi użytkownika i tak dalej.
Zastanów się nad mobilnym klientem sklepu internetowego.
Pierwsze pytanie, czy wolę JWT niż token pierwszego typu? O ile potrzebuję zalogować / wylogować użytkownika na kliencie mobilnym, muszę zapisać gdzieś token lub w przypadku JWT, token powinien zostać unieważniony przy wylogowaniu. Do unieważnienia tokena stosuje się różne podejścia. Jednym z nich jest utworzenie listy nieprawidłowych tokenów (czarna lista). Hmm Tabela / plik będzie miał znacznie większy rozmiar niż gdyby token był przechowywany w tabeli i powiązany z użytkownikiem, a po prostu usunięty podczas wylogowywania.
Jakie są więc zalety tokena JWT?
Drugie pytanie dotyczące OAuth, czy powinienem z niego korzystać w przypadku bezpośredniej komunikacji z moim serwerem? Jaki jest cel jeszcze jednej warstwy między klientem a serwerem tylko do wydawania tokena, ale komunikacja nie będzie z oauth server, ale z serwerem głównym. Jak rozumiem, serwer OAuth jest odpowiedzialny tylko za udzielanie aplikacjom zewnętrznym uprawnień (tokenów) do uzyskiwania dostępu do prywatnych informacji użytkownika. Ale moja aplikacja klienta mobilnego nie jest firmą zewnętrzną.