logowanie użytkowników aplikacji webowej

0

Cześć wszystkim.
Tworzę w celach edukacyjnych aplikację webową, która będzie pomagała w planowaniu wyjazdów wakacyjnych paczce znajomych. Na obecnym etapie wymyśliłem sobie taką architekturę, że klientem będzie aplikacja napisana w React odpalana w przeglądarce internetowej (w przyszłości mogą być inne klienty, np. apka na telefon). Klient będzie komunikował się z REST API, z którym będzie wymieniał wszystkie dane (tworzył sobie nowe wyjazdy, dodawał listę rzeczy do zabrania itd.). Backend aplikacji chciałbym oprzeć na Springu, który z jednej strony wystawia REST API dla klientów, a z drugiej strony zapisuje dane w bazie MySQL. Każdy z modułów (React klient, Spring backend, baza danych MySQL) będzie odpalany w osobnym kontenerze dockerowym.

Przyszło teraz do procesu rejestracji i logowania użytkowników mojej aplikacji. Chciałbym zrobić tak, że po wpisaniu nazwy użytkownika i hasła użytkownikowi zostaje wyświetlony w przeglądarce jego panel wraz listą jego zaplanowanych wyjazdów itd. Powiem szczerze, że wraz z czytaniem kolejnych źródeł na ten temat czuję się coraz bardziej zagubiony. Jak mam to dobrze rozwiązać w moim przypadku? Jak poprawnie obsłużyć rejestrację użytkowników, a potem ich autentykację, autoryzację i sesję? Czytałem, że REST API można zabezpieczyć na różne sposoby, jednym z nich jest OAuth2, czyli request o token i potem posługiwanie się tym tokenem żeby móc gadać z API. Ale tu się pojawiają moje wątpliwości:

  • czy ja tu nie łączę dwóch różnych problemów? Czy zabezpieczenie REST API, a obsługa użytkowników aplikacji (logowanie, sesja, rejestracja) to nie są dwie zupełnie odrębne rzeczy?
  • jak mam obsłużyć logowanie użytkowników systemu po stronie Springa skoro obrałem drogę udostępnienia klientom REST API? Jak dobrze rozumiem jeśli ma to być api zgodne z RESTful, to po stronie backend nie powinienem przechowywać stanu o zalogowanych użytkownikach.

Natknąłem się na KeyCloak, który prawdopodobnie pomoże mi w moim problemie, ale tu też mam kilka pytań. Jak rozumiem KeyCloak pozwoli mi zabezpieczyć API przed nieautoryzowanym dostępem, czyli przy zależeniu wykorzystania Oauth2 będzie pełnił rolę serwera autoryzacji. I jak rozumiem będzie to wyglądało mniej więcej tak, że użytkownik w przeglądarce kliknie przycisk zaloguj (jeśli jest zarejestrowany), zostanie przekierowany pod URI na stronę logowania, którą obsługuje KeyCloak, wprowadza login i hasło i wtedy klient React dostaje token do gadania ze Spring REST API. Od teraz każdy request do REST API przechodzi przez KeyCloaka, który sprawdza, czy token jest aktywny i zezwala lub nie na odpytanie danego endpointa.
W tym momencie zastanawiam się nad kwestią, że jeśli KeyCloak będzie zarządzał użytkownikami aplikacji i będzie przechowywał informacje na ich temat ze swojej bazie danych, to czy ja będę miał jakąś możliwość dostępu do tych danych i ich edycji? Chciałbym z poziomu klienta móc wyświetlić użytkownikowi jego profil i umożliwić mu jego edycję, ale ponadto informacje na temat użytkownika są dla mnie istotne z punktu widzenia działania samej aplikacji. Użytkownicy systemu mają być łączeni w grupy wyjazdowe, mają mieć swoje dodatkowe informacje jak na przykład lista produktów do zabrania itd. Czy to ma być zrealizowane w ten sposób, że podstawowe dane użytkowników aplikacji mają być obsługiwane przez KeyCloak, a dodatkowe informacje istotne z punktu widzenie modelu biznesowego mam trzymać u siebie w bazie danych i wiązać je z konkretnym użytkownikiem po UserID wyciagniętym jakoś z KeyCloaka po zalogowaniu? Czy tak się da zrobić i czy to jest poprawne podejście do tego tematu?

Czy zaproponowana przeze mnie architektura ma sens i tak się to robi? Czy tak powinno się realizować obsługę użytkowników w tym przypadku? Czy moje rozumienie jest prawidłowe i czy są ewentualnie jakieś lepsze alternatywy dla tego przypadku?
Jak widzicie czuję się trochę zagubiony w tym wszystkim i kręcę się w kółko, więc proszę Was o podzielenie się przemyśleniami na ten temat i nakierowanie na sposób rozwiązania mojego problemu. Dzięki i pozdrawiam!

1

Nie używałem nigdy KeyCloak więc nie odniosę się do tej części wypowiedzi.

RESTy zabezpiecz tokenem JWT i wtedy nie trzymasz sesji, tylko każdy request idzie z tokenem. Spring Security jest dość złożony, ale poniższa prezentacja mocno pomogła mi zrozumieć co gdzie i kiedy:

Natomiast tu jest dość dobry opis jak zabezpieczyć RESTy z JWT: https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/

1 użytkowników online, w tym zalogowanych: 0, gości: 1