[Angular] JWT przeładowanie strony - jak zachować role użytkowników

0

Dzień dobry,
uczę się programowania i mam pytanie
problem: po przeładowaniu strony chce aby użytkownik był zalogowany.

Napisałem sobie API, które:

  1. Po wykonaniu requesta na logowanie serwer w odpowiedzi zwraca: token, id, username, tokenExpiration, role // role użytkowników
  2. Po stronie clienta po zalogowaniu przechowuje w pamięci (behaviorSubject) te dane przez co w "AuthGuard" mogę odwołać się do tego Subject'a i sprawdzić swoje role.
  3. W pamięci lokalnej (wiem w ciasteczkach lepiej) przechowuje token, id, username, tokenExpiration.

Takie podejście jest OK do momentu w którym nie przeładuje strony (trace z pamięci (z subjecta) moje role) więc AuthGuard wyrzuca "null" bo brak autoryzacji.

  1. Nie chce przechowywać roli w tokenie JWT bo np. jeżeli niechcący przypiszę komuś role admina to będzie miał token z adminem.
  2. Rola w pamięci (local/session) nie ma miejsca bo można w przeglądarce zmienić sobie rolę na np. admina.

Teoretycznie możnałoby rozwiązać to tak:

  1. Sprawdź czy w pamięci przeglądarki jest obiekt odpowiadający za autoryzacje. (bo jeśli nie ma to znaczy, że użytkownik wcześniej nie był zalogowany więc zwraca false)
  2. Jeżeli jest to wykonaj żądanie do serwera z prośbą o zwrócenie roli użytkownika wg podanego ID
    I w ten sposób mogę uzyskać rolę danego użytkownika a potem z górki.
    Minus tego jest taki, że po przeładowaniu strony trzeba wykonać żądanie do serwera aby dowiedzieć się jaką rolę ma użytkownik.

Może macie jakiś lepszy pomysł?:D

1
  1. https://scotch.io/@PratyushB/local-storage-vs-session-storage-vs-cookie
  2. Przy prostej logice uprawnień szedłbym w strone interceptora ktory jak wylapie request z 401 to przekierowuje na login page. I po stronie frontendu nie sprawdzałbym czy ten token jest czy go nie. Jak pojdzie request z pustym tokenem to tak samo serwer powinen zwrocic 401 i wtedy nasz interceptor przekieruje nas na strone logowania.
3

I mam wrazenie ze nie rozumiesz tokenów JWT skoro mowisz o
"Rola w pamięci (local/session) nie ma miejsca bo można w przeglądarce zmienić sobie rolę na np. admina."
Jeżeli zmienisz recznie cos w tokenie to się skrót/suma kontrolna nie bedzie zgadzał i token będzie błędny.

title

2

Mam obiekt w pamięci przeglądarki który przechowuje Token i rolę użytkownika. W tej roli użytkownika mogę zmienić rolę na np. admina, a AuthGuard pobiera tą rolę przez co zaakceptuje to co jest tam wpisane (dlatego rola w pamięci odpada)

Jak już kolega wyżej wspomniał: dowolny kod uruchamiany po stronie użytkownika (czyt. cały kod frontendu) może być dowolnie przez użytkownika modyfikowany - jeśli w jakiś magiczny sposób zablokujesz możliwość zmiany tokenu, nic nie będzie stało na przeszkodzie, abym mimo to wszedł do kodu JS i podmienił if (tokenPrawidłowy) { zróbCoś(); } na zróbCoś();, skoro cały ten kod jest i tak uruchamiany w mojej przeglądarce.

Prawidłową (i jedyną skuteczną) metodą jest sprawdzanie uprawnień po stronie backendu i niezwracanie informacji, do których użytkownik nie powinien mieć dostępu; frontend w całym tym procesie jest jedynie wtórny.

0

@up
Tego też jestem w pełnii świadom, miałem nadzieje, że jest jakaś biblioteka po stronie front'u która byłaby ułatwieniem
Jakby ktoś się natknął na ten temat i byłby zainteresowany to jeszcze tutaj jest kilka ciekawych informacji https://dev.to/sebastiandg7/how-do-you-handle-role-permissions-updates-with-jwt-3778

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