Czytając Twoje pytanie, bezskutecznie próbowałem wyszukać w Internecie, w jaki sposób tokeny okaziciela są szyfrowane lub podpisywane. Wydaje mi się, że tokeny okaziciela nie są zaszyfrowane (może częściowo, ale nie całkowicie), ponieważ w takim przypadku nie będzie możliwe ich odszyfrowanie i pobranie z niego właściwości użytkowników.
Ale Twoje pytanie wydaje się próbować znaleźć odpowiedzi na temat funkcji tokena okaziciela:
Załóżmy, że implementuję dostawcę autoryzacji, czy mogę podać dowolny ciąg dla tokena okaziciela? Czy może to być losowy ciąg? Czy musi to być kodowanie base64 niektórych atrybutów? Czy powinien być zaszyfrowany?
Spróbuję więc wyjaśnić, jak działają tokeny okaziciela i tokeny odświeżania:
Gdy użytkownik wysyła do serwera token wysyłający użytkownika i hasło przez SSL, serwer zwraca dwie rzeczy: token dostępu i token odświeżania .
Token dostępu to token okaziciela, który należy dodać we wszystkich nagłówkach żądań, aby zostały uwierzytelnione jako konkretny użytkownik.
Authorization: Bearer <access_token>
Token dostępu to zaszyfrowany ciąg znaków zawierający wszystkie żądane właściwości użytkownika, oświadczenia i role. (Możesz sprawdzić, czy rozmiar tokenu zwiększa się, jeśli dodasz więcej ról lub roszczeń). Gdy serwer zasobów otrzyma token dostępu, będzie mógł go odszyfrować i odczytać te właściwości użytkownika. W ten sposób użytkownik zostanie zweryfikowany i nadany wraz z całą aplikacją.
Tokeny dostępu mają krótki okres ważności (tj. 30 minut). Gdyby tokeny dostępu miały długi okres ważności to byłby problem, bo teoretycznie nie ma możliwości ich unieważnienia. Wyobraź sobie więc użytkownika z rolą = „Administrator”, która zmienia się na „Użytkownik”. Jeśli użytkownik zachowa stary token z rolą = "Admin", będzie mógł uzyskać dostęp do wygaśnięcia tokena z uprawnieniami administratora. Dlatego tokeny dostępu mają krótki okres ważności.
Ale pojawia się jedna kwestia. Jeśli token dostępu ma krótki okres ważności, musimy co krótki okres wysyłać użytkownika i hasło. Czy to jest bezpieczne? Nie, nie jest. Powinniśmy tego unikać. Wtedy pojawiają się tokeny odświeżania, które rozwiązują ten problem.
Tokeny odświeżania są przechowywane w DB i będą miały długi okres ważności (przykład: 1 miesiąc).
Użytkownik może otrzymać nowy token dostępu (po jego wygaśnięciu, na przykład co 30 minut) za pomocą tokena odświeżania, który otrzymał w pierwszym żądaniu tokenu. Po wygaśnięciu tokenu dostępu klient musi wysłać token odświeżania. Jeśli ten token odświeżania istnieje w DB, serwer zwróci klientowi nowy token dostępu i inny token odświeżania (i zastąpi stary token odświeżania nowym).
W przypadku złamania token dostępu użytkownika, token odświeżania tego użytkownika musi zostać usunięty z bazy danych. W ten sposób token będzie ważny tylko do wygaśnięcia tokenu dostępu, ponieważ gdy haker spróbuje uzyskać nowy token dostępu, wysyłając token odświeżania, ta akcja zostanie odrzucona.