Witam,
w zasadzie nie mam pytania konkretnego, w sensie jak coś zrobić, natomiast mam pytanie ogólne,
po tym jak przejrzałem mase tutoriali i innych artykułów, najczęściej podejście do JWT w świecie React/Nextjs/Node/etc prezentuje się następująco
- wysyłane jest zapytanie np /login z danymi z formularza
- jesli jest ok, to server tworzy refresh tokena w cookie ważnego np 7 dni i zwraca json'a z access tokenem, ważnego załóżmy 5 minut, generalnie dużo krócej niż refresh token
- dla uproszczenia powiedzmy, że access token ze zapisywany w localStorage
- po zalogowaniu access token będzie wrzucany w kolejne requesty jako header w wiadomym celu
- teraz, mija te 5 minut i access token przestaje być ważny, potrzebny jest "silent refresh" który bazuje na refresh tokenie w cookie
- więc załóżmy po 5 minutach leci kolejny request do np /getSecretData, zanim dotrze do serwera, po stronie klienta trzeba należy sprawdzić, czy JWT nie jest expired, jeśli jest - to najpierw request do /refresh_token, który zwróci nowy access token i zrobi nowy refresh token w cookie i dopiero wtedy wysyłam request /getSecretData.
No i dobrze, teraz pytanie, jak po stronie klienta sprawdzić czy JWT nie jest expired? należy porównać timestamp JWT.payload.exp z obecną datą i tu moim zdaniem jest poważny problem, bo to porównanie jest z datą po stronie klienta. Klient weźmie sobie po prostu date z systemu operacyjnego, która może być np 2 godziny inna względem serwera. Nie mówię tu o strefach czasowych, po prostu można być w UTC i przestawić sobie zegarek, a Date.now() i tak zwróci faktyczną godzinę z systemu operacyjnego, nadal "myśląc", że jest w UTC.
Naturalnie rodzi to poważne problemy, jeśli token tak naprawdę nie będzie już ważny, a client po sprawdzeniu tokena powie, że jego data nie jest "większa" od daty JWT.payload.exp (bo jest np 2 godziny do tyłu), to po prostu puści request do serwera, a serwer po weryfikacji tokena zwróci przysłowiowe false. Co będzie oznaczało, że "silent refresh" nie przejdzie i jest problem.
dla ułatwienia zupełnie pomijam sprawdzanie "secret" dla JWT, tak samo pomijam czy access tokena trzymac w localStorage, czy nie, czy stateless, albo refresh tokena w bazie
Pozdrawiam i liczę jakieś komentarze ;)