• express-js
  • javascript
  • tutorial
  • auth
  • authentication
  • jwt
  • identity
  • api

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.

Gao
Gao
Founder

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:

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.

Utwórz zasób API

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.