GraphQL é tanto uma linguagem de consulta para APIs quanto um runtime para executar essas consultas com seus dados existentes. Oferece uma descrição abrangente e clara dos dados disponíveis em sua API, permite que os clientes solicitem exatamente o que precisam sem excesso, facilita a evolução das APIs ao longo do tempo e suporta ferramentas robustas para desenvolvedores.
Controle de Acesso e Otimização de Consultas GraphQL
Controle de Acesso
Autorização é um conjunto de regras ou lógica de negócios que determina se um usuário, sessão ou contexto possui a lista de controle de acesso (ACL) para realizar certas ações ou visualizar dados específicos.
Esse comportamento deve ser aplicado na camada de lógica de negócios. Embora possa ser tentador colocar a lógica de autorização diretamente na camada de GraphQL, geralmente é mais apropriado lidar com ela em outro lugar.
Otimização de Consultas
Otimizar consultas GraphQL envolve técnicas como minimizar a busca e o processamento de dados desnecessários para melhorar os tempos de resposta e reduzir a carga do servidor. Isso resulta em uma aplicação mais eficiente, oferecendo uma melhor experiência do usuário, maior engajamento e retenção do usuário e maior escalabilidade do servidor.
Formas de Otimizar Consultas GraphQL
- N+1 (Carregamento em Lote)
- Sobrecarga e Subcarga de Dados
- Caching para Redução de Latência
- Paginação
Enhancing GraphQL Access Control and GraphQL Query Optimization
Motor de Autorização valida permissões de nós e campos usando ACL (lista de controle de acesso) e otimiza consultas GraphQL com base nas permissões. Além disso, oResolvedor N+1 melhora o desempenho ao consolidar consultas. Esta abordagem resolve o problema N+1.
Atores
- Consulta GraphQL: Uma solicitação enviada por um cliente a um servidor GraphQL para buscar dados específicos.
- Motor GraphQL: Refere-se a um serviço que permite executar consultas GraphQL.
- Motor de Autorização: Valida as permissões de nós e campos usando ACL e otimiza a consulta GraphQL com base nas permissões de campos.
- Resolvedor N+1: Reduz a sobrecarga e a latência associadas a múltiplas consultas ao banco de dados, melhorando o desempenho e a eficiência.
Melhorando o Controle de Acesso
Implementação Existente
Vamos supor que um aplicativo tenha Produtos, Fornecedores e Endereços. Acessar dados de Fornecedor e Endereço requer autenticação do usuário, o que pode ser facilmente tratado nos resolvedores.
No entanto, os dados do Fornecedor são restritos a usuários administradores, e alguns campos do fornecedor são acessíveis apenas a papéis específicos. Por outro lado, os produtos são públicos e podem ser visualizados com o papel de Proprietário do Produto. Executar a consulta mencionada (Figura 3) retornará dados do produto juntamente com os dados associados do Fornecedor e Endereço, levando a uma questão de segurança.
Implementação Aprimorada
O nó e os campos da consulta são validados conforme a permissão do usuário, e uma consulta GraphQL otimizada é gerada.
A Figura 4 é um exemplo de como você pode implementar autenticação personalizada em uma API GraphQL usando Node.js. Neste código, a função é extraída do cabeçalho de Autorização e, em seguida, usada, juntamente com a consulta, para validar a autorização.
Neste exemplo, estamos usando o papel e a permissão de um usuário da sessão ou solicitação que controlam o acesso a consultas e mutações específicas no esquema GraphQL. Definimos as regras de papel e permissão no esquema GraphQL para todos os usuários.
Este método verifica recursivamente o papel e a permissão em todos os nós e campos. Se um nó ou campo não for permitido, ele realiza uma das seguintes ações com base na configuração:
- Remover nó ou campo.
- Retornar campo ou nó com uma mensagem de erro.
- Lançar exceção.
Uma vez que a consulta GraphQL seja validada contra o esquema, este método retornará a consulta GraphQL otimizada.
Aprimorando a Otimização da Consulta ORM Usando N+1
Implementação Existente
É uma questão técnica que afeta o desempenho de uma consulta. Pode ocorrer em aplicações que utilizam uma estrutura de Mapeamento Objeto-Relacional (ORM) para acessar um banco de dados.
Normalmente surge quando a aplicação precisa carregar uma coleção de entidades relacionadas do banco de dados.
Vamos supor que existem 2 produtos; é necessário fazer 1 consulta para recuperar os produtos e 2 consultas adicionais para buscar os fornecedores de cada produto individualmente.
Uma consulta recupera a lista de produtos, e uma consulta separada busca os fornecedores para cada produto. O número de consultas de fornecedores é igual ao número de produtos.
Implementação Aprimorada
Uma vez que a solicitação atinge o resolvedor N+1, o resolvedor N+1 otimiza as consultas para minimizar o número de solicitações ao banco de dados, reduzindo-as a uma única consulta para os dados principais e uma consulta adicional para os dados relacionados, efetivamente mitigando o problema N+1.
- Consulta de Dados Principais: Uma única consulta que recupera o conjunto principal de dados necessário para a aplicação.
- Consulta de Dados Relacionados: Uma consulta adicional que busca quaisquer dados relacionados necessários para completar o conjunto de dados.
Após a conclusão de todos os resolvedores de consulta, o servidor retorna os dados otimizados para o cliente em formato JSON.
Conclusão
Nós delineamos que a implementação de mecanismos de autorização granular, juntamente com medidas de segurança aprimoradas, é crucial para proteger uma API GraphQL. Isso inclui tanto a segurança no nível do nó quanto no nível do campo.
Como este artigo descreve, o problema N+1 ocorre quando uma consulta não otimizada leva a chamadas excessivas ao banco de dados no GraphQL. Nós fornecemos uma solução para superar o problema N+1. Isso diminui o uso de recursos do servidor de banco de dados, resultando em economia de custos e melhor escalabilidade. Além disso, ao aprimorar o desempenho da consulta, isso melhora a experiência do usuário, reduzindo os tempos de resposta das consultas.
Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries