GraphQL è sia un linguaggio di query per API sia un runtime per eseguire tali query con i dati esistenti. Offre una descrizione completa e chiara dei dati disponibili nella tua API, consente ai client di richiedere esattamente ciò di cui hanno bisogno senza eccessi, facilita l’evoluzione delle API nel tempo e supporta potenti strumenti per sviluppatori.
Controllo degli Accessi e Ottimizzazione delle Query GraphQL
Controllo degli Accessi
L’autorizzazione è un insieme di regole o logica aziendale che determina se un utente, una sessione o un contesto ha la lista di controllo degli accessi (ACL) per eseguire determinate azioni o visualizzare dati specifici.
Un comportamento del genere dovrebbe essere applicato a livello di logica aziendale. Sebbene possa essere allettante inserire la logica di autorizzazione direttamente nel GraphQL, è generalmente più appropriato gestirla altrove.
Ottimizzazione delle Query
Ottimizzare le query GraphQL comporta tecniche come la minimizzazione del recupero e dell’elaborazione di dati non necessari per migliorare i tempi di risposta e ridurre il carico del server. Questo porta a un’applicazione più efficiente, offrendo una migliore esperienza utente, un maggiore coinvolgimento e fidelizzazione degli utenti e una maggiore scalabilità del server.
Modi per Ottimizzare le Query GraphQL
- N+1 (Caricamento a Gruppi)
- Recupero Eccessivo e Recupero Insufficiente
- Cache per Ridurre la Latenza
- Paginazione
Migliorare il Controllo degli Accessi GraphQL e l’Ottimizzazione delle Query GraphQL
Il motore di autorizzazione valida i permessi di nodo e campo utilizzando l’ACL (lista di controllo degli accessi) e ottimizza le query GraphQL in base ai permessi. Inoltre, il risolutore N+1 migliora le prestazioni consolidando le query. Questo approccio affronta il problema N+1.
Attori
- Query GraphQL: Una richiesta inviata da un client a un server GraphQL per recuperare dati specifici.
- Motore GraphQL: Si riferisce a un servizio che consente di eseguire query GraphQL.
- Motore di autorizzazione: Valida i permessi di nodi e campi utilizzando l’ACL e ottimizza la query GraphQL in base ai permessi dei campi.
- Risolutore N+1: Riduce il sovraccarico e la latenza associati a più query di database, migliorando le prestazioni e l’efficienza.
Migliorare il controllo degli accessi
Implementazione esistente
Supponiamo che un’app abbia Prodotti, Fornitori e Indirizzi. Accedere ai dati dei Fornitori e degli Indirizzi richiede l’autenticazione dell’utente, che può essere gestita facilmente nei risolutori.
Tuttavia, i dati del fornitore sono limitati agli utenti amministratori e alcuni campi del fornitore sono accessibili solo a ruoli specifici. D’altra parte, i prodotti sono pubblici e possono essere visualizzati con il ruolo del proprietario del prodotto. Eseguendo la query menzionata (Figura 3) verranno restituiti i dati del prodotto insieme ai dati del fornitore e dell’indirizzo associati, portando a un problema di sicurezza.
Implementazione potenziata
I nodi e i campi della query vengono convalidati in base ai permessi dell’utente e viene generata una query GraphQL ottimizzata.
La Figura 4 è un esempio di come potresti implementare l’autenticazione personalizzata in un’API GraphQL utilizzando Node.js. In questo codice, il ruolo viene estratto dall’intestazione Autorizzazione e quindi utilizzato, insieme alla query, per convalidare l’autorizzazione.
In questo esempio, stiamo utilizzando ruolo e permessi di un utente dalla sessione o dalla richiesta che controllano l’accesso a query e mutazioni specifiche nello schema GraphQL. Abbiamo definito le regole di ruolo e permesso nello schema GraphQL per tutti gli utenti.
Questo metodo controlla in modo ricorsivo il ruolo e il permesso su tutti i nodi e campi. Se un nodo o campo non è consentito, esegue una delle seguenti azioni in base alla configurazione:
- Rimuovere il nodo o il campo.
- Restituire il campo o il nodo con un messaggio di errore.
- Lanciare un’eccezione.
Una volta che la query GraphQL è convalidata rispetto allo schema, questo metodo restituirà la query GraphQL ottimizzata.
Miglioramento dell’ottimizzazione della query ORM utilizzando N+1
Implementazione Esistente
Si tratta di un problema tecnico che influenza le prestazioni di una query. Può verificarsi nelle applicazioni che utilizzano un framework di Object-Relational Mapping (ORM) per accedere a un database.
Di solito si presenta quando l’applicazione deve caricare una collezione di entità correlate dal database.
Supponiamo che ci siano 2 prodotti; è necessario effettuare 1 query per recuperare i prodotti e 2 query aggiuntive per recuperare i fornitori per ciascun prodotto individualmente.
Una query recupera l’elenco dei prodotti e una query separata recupera i fornitori per ciascun prodotto. Il numero di query per i fornitori è uguale al numero di prodotti.
Implementazione Migliorata
Una volta che la richiesta raggiunge il risolutore N+1, il risolutore N+1 ottimizza le query per ridurre al minimo il numero di richieste al database, riducendole a una singola query per i dati principali e una query aggiuntiva per i dati correlati, mitigando efficacemente il problema N+1.
- Query Dati Principali: Una singola query che recupera il set principale di dati necessari per l’applicazione.
- Query Dati Correlati: Una query aggiuntiva che recupera eventuali dati correlati necessari per completare il dataset.
Dopo che tutti i risolutori delle query sono stati completati, il server restituisce i dati ottimizzati al client in formato JSON.
Conclusione
Abbiamo delineato che l’implementazione di meccanismi di autorizzazione a livello fine, insieme a misure di sicurezza migliorate, è cruciale per garantire la sicurezza di un GraphQL API. Questo include sia la sicurezza a livello di nodo che a livello di campo.
Come descritto in questo articolo, il problema N+1 si verifica quando una query non ottimizzata porta a chiamate eccessive al database in GraphQL. Abbiamo fornito una soluzione per superare il problema N+1. Essa riduce l’uso delle risorse del server del database, portando a risparmi sui costi e a una migliore scalabilità. Inoltre, migliorando le prestazioni delle query, questo migliora l’esperienza dell’utente riducendo i tempi di risposta delle query.
Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries