Proteggi la tua API Express.js con JWT e Logto
Scopri come proteggere i tuoi endpoint API Express.js con JSON Web Tokens (JWT) e Logto.
Introduzione
Quando sviluppi un'applicazione web, è fondamentale proteggere i tuoi endpoint API da accessi non autorizzati. Immagina di costruire un sito web di shopping online; sicuramente non vuoi che i ladri informatici sfruttino la tua API.
Supponendo che tu abbia già costruito un'applicazione Express.js con autenticazione utente, dove gli utenti devono effettuare l'accesso prima di intraprendere determinate azioni. Se non lo hai fatto, puoi iniziare il tuo percorso con Logto. Sono necessarie solo poche righe di codice per stabilire un flusso di autenticazione utente.
Tuttavia, anche dopo l'autenticazione utente, affronti varie scelte per proteggere i tuoi endpoint API. Sfortunatamente, la maggior parte di queste opzioni ha i suoi svantaggi:
- Autenticazione basata su sessione: Legare la tua API a uno store di sessioni, che non è scalabile e non si adatta bene ai microservizi.
- Chiamare un servizio di autenticazione: Ciò introduce una chiamata di rete aggiuntiva, aumentando la latenza e i costi. Alcuni servizi di autenticazione addirittura addebitano in base al volume di chiamate API, portando potenzialmente a spese consistenti.
In questo tutorial, dimostreremo come fortificare i tuoi endpoint API utilizzando JSON Web Tokens (JWT) e Logto. Questo approccio offre scalabilità e costi extra minimi.
Prerequisiti
Prima di iniziare, assicurati di avere quanto segue:
- Un account Logto. Se non ne hai uno, puoi registrarti gratuitamente.
- Un progetto Express.js che necessita di protezione API e un'applicazione client che utilizza l'API.
- Una familiarità di base con JSON Web Token (JWT).
Definisci la tua risorsa API in Logto
Logto sfrutta appieno RFC 8707: Resource Indicators per OAuth 2.0 per proteggere i tuoi endpoint API. Ciò significa che puoi definire le tue risorse API utilizzando i loro URL effettivi.
Naviga nella scheda "Risorse API" nella Console Logto e fai clic su "Crea risorsa API" per crearne una nuova. Ad esempio, se desideri proteggere l'endpoint /api/products
, puoi utilizzare l'URL https://yourdomain.com/api/products
come identificatore.
Ottieni un token di accesso nella tua applicazione client
Per procedere, dovrai integrare l'SDK Logto nella tua applicazione client. Questa applicazione potrebbe differire dal tuo backend Express.js; ad esempio, potresti avere un'app React che utilizza Express.js come server API backend.
Dovrai anche regolare la configurazione dell'SDK Logto per informare Logto che desideri richiedere un token di accesso per la tua API in questo grant. Ecco un esempio usando React:
Una volta che un utente effettua l'accesso con Logto, isAuthenticated
all'interno dell'SDK Logto diventerà true
:
Ora puoi usare il metodo getAccessToken
per recuperare un token di accesso per la tua API:
Infine, includi questo token di accesso nell'intestazione Authorization
quando fai richieste alla tua API:
Verifica il token di accesso nella tua API
Nella tua applicazione Express.js, installa la libreria jose
per la verifica dei JWT:
Poiché stiamo usando l'autenticazione Bearer, estrai il token di accesso dall'intestazione Authorization
:
Successivamente, crea un middleware per verificare il token di accesso:
Ora puoi impiegare questo middleware per proteggere i tuoi endpoint API:
Con questo approccio, non hai bisogno di contattare il server Logto ogni volta che arriva una richiesta. Invece, recuperi il JSON Web Key Set (JWKS) dal server Logto una volta e successivamente verifichi i token di accesso localmente.
Controllo degli accessi basato su ruoli
Fino a questo punto, abbiamo solo verificato che un utente abbia effettuato l'accesso con Logto. Ancora non sappiamo se l'utente possiede il permesso appropriato per accedere all'endpoint API. Questo perché Logto permette a chiunque di ottenere un token di accesso per una risorsa API esistente.
Per risolvere questo problema, possiamo utilizzare il controllo degli accessi basato su ruoli (RBAC). In Logto, puoi definire ruoli e assegnare permessi a essi. Consulta questo tutorial per imparare come definire ruoli e permessi in Logto.
Dopo aver definito ruoli e permessi, puoi aggiungere l'opzione scopes
al componente LogtoProvider
:
Logto emetterà quindi un token di accesso con l'ambito/i appropriato/i all'utente. Ad esempio, se un utente ha solo l'ambito read:products
, il token di accesso conterrà solo quell'ambito:
Se un utente ha sia gli ambiti read:products
che write:products
, il token di accesso conterrà entrambi gli ambiti con uno spazio come delimitatore:
Nella tua applicazione Express.js, puoi verificare se il token di accesso contiene l'ambito/i corretto/i prima di concedere l'accesso all'endpoint API:
Conclusione
Proteggere gli endpoint API pur garantendo la scalabilità non è un compito facile. In Logto, ci sforziamo di semplificare l'autenticazione delle richieste per gli sviluppatori, permettendoti di concentrarti maggiormente sulla logica aziendale.
Per qualsiasi domanda, sentiti libero di unirti al nostro server Discord. La nostra comunità è sempre felice di assisterti.