Optimaliseren van Fijnmazige GraphQL Toegangscontrole en Query-prestaties

GraphQL is zowel een querytaal voor API’s als een runtime voor het uitvoeren van die queries met uw bestaande gegevens. Het biedt een uitgebreide en duidelijke beschrijving van de gegevens die beschikbaar zijn in uw API, stelt clients in staat precies te vragen wat ze nodig hebben zonder overbodigheden, faciliteert de evolutie van API’s over tijd en ondersteunt robuuste ontwikkelaarstools.

GraphQL Toegangscontrole en Query Optimalisatie

Toegangscontrole

Autorisatie is een set regels of bedrijfslogica die bepaalt of een gebruiker, sessie of context de toegangscontrolelijst (ACL) heeft om bepaalde acties uit te voeren of specifieke gegevens te bekijken.

Zulk gedrag moet worden afgedwongen op het niveau van de bedrijfslogica. Hoewel het verleidelijk kan zijn om autorisatielogica direct binnen de GraphQL laag te plaatsen, is het généralement meer gepast om dit elders af te handelen.

Query Optimalisatie

Het optimaliseren van GraphQL-queries omvat technieken zoals het minimaliseren van onnodige gegevensophaalmethoden en -verwerking om responstijden te verbeteren en de serverbelasting te verminderen. Dit resulteert in een efficiëntere applicatie, die een betere gebruikerservaring, verhoogde gebruikersbetrokkenheid en -retentie, en grotere server schaalbaarheid biedt.

Manieren om GraphQL Query te Optimaliseren

  • N+1 (Gebatchte Laden)
  • Over-Ophalen en Onder-Ophalen
  • Caching voor Verminderde Latentie
  • Paginering

Verbeteren van GraphQL Toegangscontrole en GraphQL Query Optimalisatie

Autorisatie-engine valideert knooppunt- en veldmachtigingen met behulp van ACL (toegangscontrolelijst) en optimaliseert GraphQL-query’s op basis van de machtigingen. Daarnaast verbetert de N+1 Resolver de prestaties door query’s te consolideren. Deze aanpak behandelt het N+1-probleem. 

Figure 1



Actoren

  • GraphQL Query: Een verzoek dat door een client naar een GraphQL-server wordt gestuurd om specifieke gegevens op te halen.
  • GraphQL Engine: Verwijst naar een service die je in staat stelt GraphQL-query’s uit te voeren. 
  • Autorisatie-engine: valideert de machtigingen van knooppunten en velden met behulp van ACL en optimaliseert de GraphQL-query op basis van veldmachtigingen.
  • N+1 Resolver: Vermindert de overhead en latency die gepaard gaan met meerdere databasequery’s, waardoor de prestaties en efficiëntie worden verbeterd.

Figure 2

Figure 3

Toegangscontrole verbeteren

Huidige Implementatie

Laten we aannemen dat een app Producten, Leveranciers en Adressen heeft. Het benaderen van Leverancier- en Adresgegevens vereist gebruikersauthenticatie, wat eenvoudig kan worden afgehandeld in resolvers.

Echter, leveranciersgegevens zijn beperkt tot admin-gebruikers, en sommige leveranciersvelden zijn alleen toegankelijk voor specifieke rollen. Aan de andere kant zijn producten openbaar en kunnen deze worden bekeken met de Product Owner-rol. Het uitvoeren van de genoemde query (Figuur 3) zal productgegevens retourneren samen met bijbehorende Leveranciers- en Adresgegevens, wat leidt tot een beveiligingsprobleem.

Geavanceerde Implementatie

Node en velden van de query worden gevalideerd volgens de toestemming van de gebruiker, en een geoptimaliseerde GraphQL-query wordt gegenereerd.

Figure 3.1 (Flow Diagram)

 

Figure 4

Figuur 4 is een voorbeeld van hoe je mogelijk aangepaste authenticatie kunt implementeren in een GraphQL API met behulp van Node.js. In deze code wordt de rol uit de Autorisatie-header gehaald en vervolgens, samen met de query, gebruikt om de autorisatie te valideren.

Figure 5

In dit voorbeeld gebruiken we de rol en toestemming van een gebruiker uit de sessie of aanvraag die de toegang tot specifieke queries en mutaties in het GraphQL-schema controleren. We hebben de rol- en toestemmingregels gedefinieerd in het GraphQL-schema voor alle gebruikers.

Deze methode controleert recursief de rol en toestemming op alle nodes en velden. Als een node of veld niet is toegestaan, voert het een van de volgende acties uit op basis van de configuratie:

  • Verwijder node of veld.
  • Retourneer veld of node met een foutmelding.
  • Gooi uitzondering.

Zodra de GraphQL-query is gevalideerd tegen het schema, zal deze methode de geoptimaliseerde GraphQL-query retourneren.

ORM Query Optimalisatie Verhogen Met N+1

Huidige Implementatie

Het is een technisch probleem dat de prestaties van een query beïnvloedt. Het kan voorkomen in toepassingen die een Object-Relational Mapping (ORM) framework gebruiken om toegang te krijgen tot een database.

Het komt meestal voor wanneer de applicatie een verzameling gerelateerde entiteiten uit de database moet laden.

Laten we aannemen dat er 2 producten zijn; het moet 1 query uitvoeren om de producten op te halen en 2 extra queries om de leveranciers voor elk product afzonderlijk op te halen.

Figure 6

Figure 7

Eén query haalt de lijst van producten op, en een aparte query haalt de leveranciers voor elk product op. Het aantal leveranciersqueries is gelijk aan het aantal producten.

Verbeterde Implementatie

Zodra het verzoek de N+1-resolver bereikt, optimaliseert de N+1-resolver queries om het aantal databaseverzoeken te minimaliseren door deze te reduceren tot één query voor de hoofdgegevens en een extra query voor gerelateerde gegevens, waardoor het N+1-probleem effectief wordt verholpen.

  1. Hoofd Data Query: Een enkele query die de hoofdset gegevens ophaalt die vereist zijn voor de applicatie.
  2. Gerelateerde Data Query: Een extra query die alle benodigde gerelateerde gegevens ophaalt om de dataset te voltooien.

Figure 8

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

Figure 10

Nadat alle query resolvers zijn voltooid, retourneert de server de geoptimaliseerde gegevens aan de client in JSON-formaat.

Conclusie

We hebben uiteengezet dat het implementeren van fijnmazige autorisatiemechanismen, samen met versterkte beveiligingsmaatregelen, cruciaal is voor het beveiligen van een GraphQL-API. Dit omvat zowel node-niveau als veldniveau beveiliging.

Zoals in dit artikel wordt beschreven, treedt het N+1-probleem op wanneer een niet-geoptimaliseerde query leidt tot excessieve databaseoproepen in GraphQL. We hebben een oplossing aangedragen om het N+1-probleem te overwinnen. Het vermindert het gebruik van database serverbronnen, wat resulteert in kostenbesparingen en betere schaalbaarheid. Bovendien verbetert het door de query-prestaties te verhogen de gebruikerservaring door de reactietijden van queries te verminderen.

Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries