Chciałem się upewnić czy dobrze rozumiem idee refresh tokenu i użycie go w celu zaimplementowania opcji automatycznego logowania na stronie.
- użytkownik podaje login i hasło i zaznacza wspomnianą opcję
- po poprawnej walidacji, w odpowiedzi z serwera wraca access token oraz refresh token
- obydwa tokeny są zapisane w localStorage, wraz z flagą
stayLoggedIn: true
bądź podobną - do każdego zapytania HTTP doklejany jest Bearer $accessToken
- po pewnym czasie odpowiedź z serwera to 401 z wiadomością "token expired"
- klient (aplikacja frontendowa) w takiej sytuacji (
if(stayLoggedIn)
) wysyła nowe żądanie na/refreshToken
, podając parę tokenów zapisanych w localStorage - po stronie serwera, sprawdzane jest czy access token faktycznie wygasł, a poza tym jest w porządku (nie ma z nim innych problemów, jak niezgodność payloadu z kluczem, itp), a także walidowany jest refresh token
- jeżeli wszystko jest ok, to w odpowiedzi wraca para nowo wygenerowanych access oraz refresh tokenów
- Czy mniej więcej tak powinien wyglądać flow takiej funkcjonalności?
- Czy access + refresh token powinien być gdzieś zapisany? np. po walidacji struktury tokenów sprawdzam jeszcze w bazie danych czy jest tam para access : refresh token, zgodna z tym co dostałem w requeście
- Jak długo zwykle powinien być ważny access a jak długo refresh token? 1 godzina dla access tokena, 7 dni dla refresh tokena? czy zupełnie inny rząd wielkości?
- Jeżeli ustawie ważność refresh tokenu na te 7 dni, to w dalszym ciągu w pewnym momencie użytkownik zostanie wylogowany. W jaki sposób więc się przed tym zabezpieczyć? Po stronie frontu weryfikować przy każym requeście ile zostało czasu do wygaśnięcia tokenu i gdy zostanie powiedzmy 10 minut, to od razu wołać
/refreshtoken
?