Chroń swoje API Express.js przy użyciu JWT i Logto
Naucz się, jak chronić punkty końcowe swojego API Express.js za pomocą Tokenów Webowych JSON (JWT) i Logto.
Wprowadzenie
Podczas tworzenia aplikacji internetowej kluczowe jest zabezpieczenie punktów końcowych API przed nieautoryzowanym dostępem. Wyobraź sobie, że budujesz stronę z zakupami online; na pewno nie chcesz, aby cyber-złodzieje eksploatowali twoje API.
Zakładając, że już stworzyłeś aplikację Express.js z uwierzytelnianiem użytkowników, gdzie użytkownicy muszą się zalogować, zanim wykonają określone działania. Jeśli nie, możesz rozpocząć swoją przygodę z Logto. Wymaga to tylko kilku linii kodu, aby ustanowić przepływ uwierzytelniania użytkowników.
Jednak nawet po uwierzytelnieniu użytkownika, stajesz przed różnymi wyborami, aby chronić swoje punkty końcowe API. Niestety, większość tych opcji ma swoje wady:
- Uwierzytelnianie oparte na sesji: Łączenie API ze sklepem sesji, co nie jest skalowalne i nie pasuje do mikrousług.
- Wywołanie serwisu uwierzytelniania: To wprowadza dodatkowe wywołanie sieciowe, zwiększając opóźnienia i koszty. Niektóre usługi uwierzytelniania pobierają opłaty w zależności od liczby wywołań API, co może prowadzić do wysokich kosztów.
W tym tutorialu pokażemy, jak wzmocnić swoje punkty końcowe API za pomocą Tokenów Webowych JSON (JWT) i Logto. To podejście oferuje skalowalność i minimalne dodatkowe koszty.
Wymagania wstępne
Przed rozpoczęciem upewnij się, że masz:
- Konto Logto. Jeśli go nie masz, możesz zarejestrować się za darmo.
- Projekt Express.js, który wymaga ochrony API i aplikacj ę kliencką, która korzysta z API.
- Podstawową znajomość JSON Web Token (JWT).
Zdefiniuj swoje zasoby API w Logto
Logto w pełni wykorzystuje RFC 8707: Wskaźniki zasobów dla OAuth 2.0 do zabezpieczenia swoich punktów końcowych API. Oznacza to, że możesz zdefiniować swoje zasoby API za pomocą ich rzeczywistych URL-i.
Przejdź do zakładki "Zasoby API" w Konsoli Logto i kliknij "Utwórz zasób API", aby utworzyć nowy. Na przykład, jeśli chcesz chronić punkt końcowy /api/products
, możesz użyć URL https://yourdomain.com/api/products
jako identyfikatora.
Uzyskaj token dostępu w swojej aplikacji klienckiej
Aby kontynuować, musisz zintegrować SDK Logto z aplikacją kliencką. Ta aplikacja mo że różnić się od twojego backendu Express.js; na przykład, możesz mieć aplikację React używającą Express.js jako serwera API backendu.
Będziesz również musiał dostosować konfigurację SDK Logto, aby poinformować Logto, że chcesz zażądać tokenu dostępu dla swojego API w tym grant. Oto przykład użycia React:
Gdy użytkownik zaloguje się za pomocą Logto, isAuthenticated
w SDK Logto stanie się true
:
Teraz możesz użyć metody getAccessToken
, aby pobrać token dostępu dla swojego API:
Na końcu dodaj ten token dostępu do nagłówka Authorization
podczas wysyłania żądań do swojego API:
Zweryfikuj token dostępu w swoim API
W swojej aplikacji Express.js zainstaluj bibliotekę jose
do weryfikacji JWT:
Ponieważ używamy uwierzytelniania typu Bearer, wyciągnij token dostępu z nagłówka Authorization
:
Następnie, utwórz middleware do weryfikacji tokenu dostępu:
Teraz możesz użyć tego middleware do ochrony swoich punktów końcowych API:
Dzięki temu podejściu nie musisz kontaktować się z serwerem Logto za każdym razem, gdy przychodzi żądanie. Zamiast tego, pobierasz Zestaw Kluczy Webowych JSON (JWKS) z serwera Logto raz i następnie lokalnie weryfikujesz tokeny dostępu.
Kontrola dostępu oparta na rolach
Do tego momentu tylko sprawdziliśmy, że użytkownik zalogował się przy użyciu Logto. Nadal nie wiemy, czy użytkownik ma odpowiednie uprawnienia do uzyskania dostępu do punktu końcowego API. Wynika to z faktu, że Logto pozwala każdemu uzyskać token dostępu do istniejącego zasobu API.
Aby to rozwiązać, możemy użyć kontroli dostępu opartej na rolach (RBAC). W Logto możesz definiować role i przypisywać im uprawnienia. Zapoznaj się z tym tutorialem, aby dowiedzieć się, jak definiować role i uprawnienia w Logto.
Po zdefiniowaniu ról i uprawnień możesz dodać opcję scopes
do komponentu LogtoProvider
:
Logto następnie wyda jedynie token dostępu z odpowiednim zasięgiem użytkownikowi. Na przykład, jeśli użytkownik ma tylko zasięg read:products
, token dostępu będzie zawierał tylko ten zasięg:
Jeśli użytkownik ma zarówno zasięg read:products
, jak i write:products
, token dostępu będzie zawierał oba zasięgi z separatorem przestrzeni:
W aplikacji Express.js możesz sprawdzić, czy token dostępu zawiera poprawne zasięgi, zanim przyznasz dostęp do punktu końcowego API:
Podsumowanie
Ochrona punktów końcowych API przy jednoczesnym zapewnieniu skalowalności to nie lada wyzwanie. W Logto staramy się uprościć uwierzytelnianie żądań dla deweloperów, aby mogli bardziej skupić się na logice biznesowej.
W razie jakichkolwiek pytań zapraszamy do dołączenia do naszego serwera Discord. Nasza społeczność zawsze chętnie pomoże.