• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odświeżanie accessToken'u

Object Storage Arubacloud
+1 głos
255 wizyt
pytanie zadane 21 sierpnia 2020 w JavaScript przez poldeeek Mądrala (5,980 p.)
Zastanawiam się w jaki sposób powinno się odbywać odświeżanie accessTokenu i refreshTokenu, bo póki co widzę tylko 2 opcje.
Po stronie klienta napisać jakąś funkcję automatycznie odświeżającą tokeny, która będzie działała, obliczała czas do końca ważności accessTokenu i po tym czasie wyśle request do endpoint'u /refresh i dostanie od niego nowe tokeny.

Czy jeśli czas accessTokenu się skończy i dopiero po otrzymaniu odpowiedzi ze statusem 401 wysłać request do endpointu /refresh, a po otrzymaniu nowych tokenów ponowić pierwotne zapytanie do serwera ?

No i ponad to w obu przypadkach generować nowe tokeny przy każdym wysyłanym request'cie.

2 odpowiedzi

0 głosów
odpowiedź 21 sierpnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)
edycja 22 sierpnia 2020 przez jankustosz1
Powiem, jak jest to w Firebase, bo wydaje mi się, że programiści Google się na tym znają.

Przy uwierzytelnieniu dostaje się 2 tokeny, tak jak pisałeś access i refresh, które są ważne tylko przez godzinę. Idea jest taka by przechowywać tylko access token, bo w razie jego wykradnięcia, haker będzie miał dostęp do danych tylko do upłynięcia godziny i nie będzie miał, możliwości by ten czas przedłużyć. Natomiast gdyby wykradł refresh token to mógłby mieć już dostęp na zawsze, bo wystarczy, że co godzinę generowałby nowy.

Dlatego bardzo ważne jest, by w razie konieczności przechowywania także refresh tokena dobrze go zabezpieczyć, jakoś umiejętnie zaszyfrować, czy coś tego typu, myślę, że ktoś to lepiej napisze jak go przechowywać.

Odnośnie pytania, wydaje mi się, że zaraz po dostaniu tokena ustawienie jakiegoś setTimeout nie jest złym rozwiązaniem(oczywiście jeżeli ta funkcjonalność jest potrzebna)
1
komentarz 21 sierpnia 2020 przez Ehlert Ekspert (212,670 p.)

refresh tokena dobrze go zabezpieczyć, jakoś umiejętnie zaszyfrować

Trochę poleciałeś. Szyfrowanie po stronie usera? Nie widzę jak miałoby to wyglądać.

0 głosów
odpowiedź 21 sierpnia 2020 przez Ehlert Ekspert (212,670 p.)
Zapisujesz access i refresh token. W momencie kiedy wygasa access dostajesz 401 i automatycznie wysyłasz refresh. Po otrzymaniu nowego access tokena ponawiasz request o dane.

Kiedy wygaśnie refresh jesteś wylogowany.
komentarz 22 sierpnia 2020 przez poldeeek Mądrala (5,980 p.)
Refresh trzymam w ciasteczkach, a Access w zwykłej zmiennej let.
Właśnie nie mam pojęcia w jaki sposób zaimplementować wysyłanie refresh'a i ponowne wysłanie request'u, żeby było w miare uniwersalne. Mógłbym to napisać na klika promis'ów w jednym zapytaniu wszystko, ale wydaje mi się to słabe rozwiązanie, bo każde zapytanie do serwera będzie miało wtedy bardzo dużo kodu
komentarz 22 sierpnia 2020 przez Ehlert Ekspert (212,670 p.)
  1. Użyj async await. 
  2. Trzymaj w tokeny w localStorage, co refresh strony będziesz generować access?
  3. Po to masz serwisy, interfejsy oraz abstrakcję żeby wywoływać funkcję getPost, a to czy pod spodem leci jeden czy dwadzieścia requestów, to już nie powinno Cię interesować.
komentarz 22 sierpnia 2020 przez poldeeek Mądrala (5,980 p.)
const onSubmit = (values: Values) => {

    fetch("http://localhost:5000/api/posts", {
      method: "POST",
      credentials: "include",
      headers: {
        "Content-Type": "application/json",
        // 'Content-Type': 'application/x-www-form-urlencoded',
      },

      body: JSON.stringify({
        name: "Nazwa",
        text: "jakiś post",
        id: "341324132"
      }),
    })
      .then((response) => {
        if (response.status == 401) {
          refreshTokens();
          [...]
        }
        return response.json();
      })
      .then((resp) => console.log(resp))
      .catch((err) => {
        console.log(err);
      });
  };

Z czym mam problem to co wpisać w miejscu [...], funckja refreshTokens() wysyłała by request z odświeżeniem tokenów. Tylko nie wiem w jaki sposób wrócić do wywołania "dodania postu" od nowa po odświeżeniu tokenów...

komentarz 22 sierpnia 2020 przez Ehlert Ekspert (212,670 p.)

Używaj async await wink albo wydziel wysyłanie do osobnej funkcji.

Podobne pytania

+1 głos
1 odpowiedź 107 wizyt
pytanie zadane 16 listopada 2020 w JavaScript przez Jiangshi Nowicjusz (130 p.)
+1 głos
1 odpowiedź 188 wizyt
pytanie zadane 12 listopada 2020 w JavaScript przez LixI Nowicjusz (130 p.)
+1 głos
1 odpowiedź 398 wizyt

92,539 zapytań

141,382 odpowiedzi

319,479 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...