Chodzi o mechanizm przełączania kont użytkowników podobny jak w Google, YouTube...
Architektura:
- serwer autentykacyjny z użyciem Spring Security
- inne mikroserwisy (dostęp tylko z tokenem JWT)
- load balancer weryfikujący token JWT
- aplikacja webowa
Działa to tak, że użytkownik loguje się w aplikacji webowej i serwer autentykacyjny generuje token JWT.
POST /token?username=user&password=pass&grant_type=password&scope=read
Oprócz tego wysyłany jest nagłówek Authorization typu basic, gdzie uwierzytelniamy aplikację kliencką.
Authorization: Basic ...........
W Spring Security dużo rzeczy dzieje się automatycznie. Jeśli nie ma sesji zalogowanego użytkownika, to endpoint /token działa, weryfikuje użytkownika i zwraca ważny token JWT. Ale teraz chcemy przełączyć się na inne konto.
Dane wejściowe, jakimi dysponujemy:
- token JWT zalogowanego użytkownika
- ID użytkownika, na jakiego chcemy przełączyć (będzie weryfikacja, czy to user powiązany)
- nie chcę w aplikacji webowej przechowywać wpisanego loginu i hasła (kwestie bezpieczeństwa)
Dawniej Spring Security posiadał możliwość wielu sesji, ale już nie ma. Jest funkcja przełączenia się na dowolnego użytkownika (bez weryfikacji), jednak to odpada, bo musimy weryfikować, na kogo.
Najlepiej chyba byłoby to zrobić tak, że tworzymy endpoint np. /switch i wysyłamy nagłówek Authorization: Bearer z tokenem JWT. Problem w tym, że wtedy Spring Security tego nie rozumie i wysyła odpowiedź Unauthenticated. Być może trzeba napisać filtr lub wykorzystać istniejący, żeby dla tego konkretnego endpointu był sprawdzany token JWT, a potem go ręcznie generować. Ktoś wie, jak to ugryźć i czy Spring Security ma coś takiego?