JSON Web Token jest standardem używanym do tworzenia tokenów dostępu dla aplikacji.
działa to w ten sposób: serwer generuje token potwierdzający tożsamość użytkownika i wysyła go do klienta.
klient wysyła token z powrotem do serwera dla każdego kolejnego żądania, więc serwer wie, że żądanie pochodzi z konkretnej tożsamości.
ta architektura okazuje się bardzo skuteczna w nowoczesnych aplikacjach internetowych, gdzie po uwierzytelnieniu użytkownika wykonujemy żądania API do REST lub GraphQL API.
kto używa JWT?, Na przykład Google. Jeśli korzystasz z interfejsów API Google, będziesz korzystać z JWT.
JWT jest podpisany kryptograficznie (ale nie zaszyfrowany, dlatego używanie HTTPS jest obowiązkowe podczas przechowywania danych użytkownika w JWT), więc istnieje gwarancja, że możemy mu zaufać, gdy go otrzymamy, ponieważ żaden pośrednik nie może przechwycić i zmodyfikować go lub przechowywanych danych, bez ich unieważnienia.
To powiedziawszy, JWTs są często krytykowane za ich nadużywanie, a zwłaszcza za ich używanie, gdy można użyć mniej problematycznych rozwiązań.
musisz wyrobić sobie opinię na ten temat., Nie opowiadam się za technologią nad inną, po prostu przedstawiam wszystkie możliwości i narzędzia, które masz do dyspozycji.
do czego są dobre? Głównie uwierzytelnianie API i autoryzacja server-to-server.
w jaki sposób generowany jest token JWT?
za pomocą węzła.,js możesz wygenerować pierwszą część tokena używając tego kodu:
const header = { "alg": "HS256", "typ": "JWT" }const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64')
ustawiamy algorytm podpisywania na HMAC SHA256
(JWT obsługuje wiele algorytmów), a następnie tworzymy bufor z tego JSON-a2911ea7e2 zakodowany obiekt, a kodujemy go za pomocą Base64.
wynik częściowy toeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
następnie dodajemy ładunek, który możemy dostosować dowolnymi danymi., Istnieją zastrzeżone klucze, w tym iss
I exp
, które identyfikują emitenta i czas wygaśnięcia tokena.
możesz dodać własne dane do tokena za pomocą obiektu:
const payload = { username: 'Flavio' }
konwertujemy ten obiekt, kodowany JSON, do bufora i kodujemy wynik za pomocą base64, tak jak wcześniej:
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64')
w tym przypadku wynik częściowy to eyJ1c2VybmFtZSI6IkZsYXZpbyJ9
.,
następnie otrzymujemy podpis z nagłówka i zawartości payload, co zapewnia, że nasza zawartość nie może zostać zmieniona, nawet jeśli zostanie przechwycona, ponieważ nasz podpis zostanie unieważniony. Aby to zrobić, użyjemy crypto
moduł węzła:
używamy secretKey
tajny klucz i utworzymy zakodowaną reprezentację zaszyfrowanego podpisu base64.,
wartość podpisu w naszym przypadku to
MQWECYWUT7bayj8miVgsj8KdYI3ZRVS+WRRZjfZrGrw=
prawie skończyliśmy, wystarczy połączyć 3 części nagłówka, ładunku i podpis, oddzielając je kropką:
const jwt = `${encodedHeader}.${encodedPayload}.${signature}`
uwierzytelnianie API
jest to prawdopodobnie jedyny sensowny sposób użycia JWT.
powszechnym scenariuszem jest: rejestrujesz się w usłudze i pobierasz JWT z Pulpitu nawigacyjnego usługi. To jest to, czego będziesz używać od teraz do uwierzytelniania wszystkich żądań na serwerze.,
innym przypadkiem użycia, który jest odwrotnie, jest wysyłanie JWT, gdy zarządzasz API i klienci łączą się z Tobą, i chcesz, aby użytkownicy wysyłali kolejne żądania, po prostu przekazując token.
w takim przypadku Klient musi gdzieś przechowywać token. Gdzie jest najlepsze miejsce? W pliku cookie HttpOnly. Wszystkie inne metody są podatne na ataki XSS i jako takie należy ich unikać. Plik cookie HttpOnly nie jest dostępny z JavaScript i jest automatycznie wysyłany do serwera origin na każde żądanie, więc idealnie pasuje do przypadku użycia.,
Wybierz najlepszą bibliotekę JWT
w zależności od używanego języka i środowiska możesz wybierać spośród wielu bibliotek. Najpopularniejsze są wymienione w jwt.io strona internetowa.
nie używaj JWTs jako tokenów sesji
nie powinieneś używać JWTs do sesji. Użyj zwykłego mechanizmu sesji po stronie serwera, ponieważ jest on znacznie bardziej wydajny i mniej podatny na ekspozycję danych.