Buduję aplikację mobilną i używam JWT do uwierzytelniania.
Wydaje się, że najlepszym sposobem na to jest sparowanie tokena dostępu JWT z tokenem odświeżania, aby móc wygasać token dostępu tak często, jak chcę.
- Jak wygląda token odświeżania? Czy to losowy ciąg? Czy ten ciąg jest zaszyfrowany? Czy to kolejny JWT?
- Token odświeżania byłby przechowywany w bazie danych w modelu użytkownika w celu uzyskania dostępu, prawda? Wygląda na to, że w tym przypadku powinien być zaszyfrowany
- Czy odesłałbym token odświeżania z powrotem po zalogowaniu użytkownika, a następnie pozwoliłbym klientowi uzyskać dostęp do oddzielnej trasy w celu pobrania tokenu dostępu?
security
authentication
oauth-2.0
jwt
jtmarmon
źródło
źródło
Odpowiedzi:
Zakładając, że chodzi o OAuth 2.0, ponieważ chodzi o tokeny JWT i tokeny odświeżania ...:
tak jak token dostępu, w zasadzie token odświeżania może być wszystkim, w tym wszystkimi opcjami, które opisujesz; token JWT może być użyty, gdy serwer autoryzacji chce być bezstanowy lub chce narzucić klientowi prezentującemu go pewnego rodzaju semantykę „dowodu posiadania”; zwróć uwagę, że token odświeżania różni się od tokena dostępu tym, że nie jest prezentowany serwerowi zasobów, ale tylko serwerowi autoryzacji, który go wystawił, więc niezależna optymalizacja walidacji dla tokenów JWT-as-access nie przechowywać dla tokenów odświeżania
zależy to od bezpieczeństwa / dostępu do bazy danych; jeśli dostęp do bazy danych mają inne strony / serwery / aplikacje / użytkownicy, to tak (ale Twój przebieg może się różnić w zależności od miejsca i sposobu przechowywania klucza szyfrowania ...)
serwer autoryzacji może jednocześnie wystawiać tokeny dostępu i tokeny odświeżania, w zależności od nadania używanego przez klienta do ich uzyskania; specyfikacja zawiera szczegóły i opcje dotyczące każdego standardowego grantu
źródło
Poniżej znajdują się czynności umożliwiające unieważnienie tokenu dostępu JWT:
Daj mi znać, jeśli potrzebujesz więcej informacji, mogę również udostępnić kod (rozruch Java + Spring).
W przypadku pytań:
P1: To kolejny JWT z mniejszą liczbą zgłoszonych roszczeń i długim czasem wygaśnięcia.
P2: Nie będzie w bazie danych. Backend nie będzie nigdzie przechowywać. Po prostu odszyfrują token kluczem prywatnym / publicznym i zweryfikują go również z czasem wygaśnięcia.
P3: tak, zgadza się
źródło
localStorage
arefreshToken
powinien być przechowywany w plikuhttpOnly
.refreshToekn
Mogą być wykorzystywane, aby otrzymać nowy JWT więc musi być traktowane ze szczególną ostrożność.Oparte na tej implementacji z Node.js JWT z tokenem odświeżania :
1) W tym przypadku używają uid i nie jest to JWT. Kiedy odświeżają token, wysyłają token odświeżania i użytkownika. Jeśli zaimplementujesz go jako token JWT, nie musisz wysyłać użytkownika, ponieważ zrobiłby to wewnątrz tokena JWT.
2) Wdrażają to w oddzielnym dokumencie (tabeli). Ma to dla mnie sens, ponieważ użytkownik może być zalogowany w różnych aplikacjach klienckich i może mieć token odświeżania według aplikacji. Jeśli użytkownik utraci urządzenie z zainstalowaną jedną aplikacją, token odświeżania tego urządzenia może zostać unieważniony bez wpływu na inne zalogowane urządzenia.
3) W tej implementacji odpowiada na metodę logowania zarówno za pomocą tokena dostępu, jak i tokena odświeżania. Wydaje mi się to poprawne.
źródło
iat
w oknie) - ponownie wystaw nowy na podstawie poprzedniegoJWT
co chcesz mieć wrefresh_token
środku? Jeśli tak, OAuth RFC 6749 wyraźnie mówi, aby nie wysyłaćrefresh_token
do serwera zasobów (iJWT
jest wysyłany do serwerów zasobów): tools.ietf.org/html/rfc6749#section-1.5