OTTIMIZZAZIONE DEL CONTROLLO DELL’ACCESSO GRAFICO FINE-GRAINED DI GRAPHQL E DELLE PRESTAZIONI DELLE QUERY

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.

Figure 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.

Figure 2

Figure 3

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.

Figure 3.1 (Flow Diagram)

 

Figure 4

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.

Figure 5

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.

Figure 6

Figure 7

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.

  1. Query Dati Principali: Una singola query che recupera il set principale di dati necessari per l’applicazione.
  2. Query Dati Correlati: Una query aggiuntiva che recupera eventuali dati correlati necessari per completare il dataset.

Figure 8

Figure 9: Total No. of Queries are 2 (1 for Product, 1 for Vendor)

Figure 10

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