W sieci jest wiele informacji na temat używania JWT ( Json Web Token
) do uwierzytelniania. Ale nadal nie znalazłem jasnego wyjaśnienia, jaki powinien być przepływ podczas używania tokenów JWT do rozwiązania pojedynczego logowania w środowisku wielu domen .
Pracuję dla firmy, która ma wiele witryn na różnych hostach. Użyjmy example1.com i example2.com . Potrzebujemy rozwiązania jednokrotnego logowania, co oznacza, że jeśli użytkownik uwierzytelnia się w witrynie example1.com , chcemy, aby był on również uwierzytelniany automatycznie w witrynie example2.com .
Rozumiem, że korzystając z przepływu OpenId Connect użytkownik, który chce uwierzytelnić się w witrynie example1.com, zostanie najpierw przekierowany na serwer uwierzytelniania (lub OP
: „OpenId Provider”). Użytkownik uwierzytelnia się na tym serwerze, który następnie przekierowuje go z powrotem do oryginalnej witryny example1.com z podpisanym tokenem JWT. (Rozumiem, że istnieje inny przepływ, który zwraca token pośredni, który sam można później wymienić na prawdziwy token JWT, ale nie sądzę, że jest to dla nas wymagane) ...
Teraz użytkownik jest z powrotem na example1.com i jest uwierzytelniony! Potrafi wysyłać żądania, przekazując token JWT w Authentication
nagłówku, a serwer jest w stanie zweryfikować podpisany JWT i dzięki temu jest w stanie zidentyfikować użytkownika. Miły!
Pierwsze pytanie :
W jaki sposób token JWT powinien być przechowywany na kliencie? Jest znowu wiele informacji na ten temat i wydaje się, że ludzie zgadzają się, że używanie Web Storage
jest właściwą drogą, a nie starym dobrym cookies
. Chcemy, aby token JWT był trwały między ponownymi uruchomieniami przeglądarki, więc używajmy Local Storage
, a nie Session Storage
...
Teraz użytkownik może zrestartować przeglądarkę i nadal będzie uwierzytelniany na example1.com , o ile token JWT nie wygaśnie!
Ponadto, jeśli example1.com musi wysłać żądanie Ajax do innej z naszych domen, rozumiem, że konfiguracja CORS na to pozwoli. Ale naszym głównym przypadkiem użycia nie są żądania międzydomenowe, ale rozwiązanie jednokrotnego logowania !
Dlatego główne pytanie:
Jaki powinien być teraz przepływ, jeśli użytkownik przejdzie do example2.com i chcemy, aby został uwierzytelniony przy użyciu tokena JWT, który już posiada? Local Storage
wygląda na to, że nie zezwala na dostęp między domenami, więc w tym momencie przeglądarka nie może odczytać tokenu JWT w celu wysłania żądań do example2.com !
Powinien :
- Czy użytkownik został ponownie przekierowany do serwera uwierzytelniania ? Gdy użytkownik uwierzytelnił się w witrynie example1.com , serwer uwierzytelniania mógł ustawić plik cookie dla użytkownika, więc to nowe żądanie uwierzytelnienia dla domeny example2.com może użyć tego pliku cookie, aby sprawdzić, czy użytkownik jest już uwierzytelniony i natychmiast przekierowuje go z powrotem do example2.com z tym samym tokenem JWT?
- A może przeglądarka w witrynie example2.com może uzyskać dostęp do tokena JWT bez konieczności ponownego przechodzenia do serwera uwierzytelniania ? Widzę, że istnieją rozwiązania typu cross-storage , ale czy są one szeroko stosowane? Czy są one sugerowanym rozwiązaniem dla środowiska logowania jednokrotnego między domenami?
Nie chcemy niczego wyszukanego, bylibyśmy zadowoleni z najczęściej używanego rozwiązania!