O GraphQL é tanto uma linguagem de consulta para APIs quanto um tempo de execução para executar essas consultas com seus dados existentes. Ele oferece uma descrição abrangente e clara dos dados disponíveis em sua API, permite que os clientes solicitem precisamente o que precisam sem excessos, facilita a evolução das APIs ao longo do tempo e suporta ferramentas de desenvolvedor robustas.
Controle de Acesso e Otimização de Consulta do GraphQL
Controle de Acesso
A 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 executar determinadas 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 do GraphQL, geralmente é mais apropriado lidar com isso em outro lugar.
Otimização de Consultas
Otimizar consultas do GraphQL envolve técnicas como minimizar a busca e processamento de dados desnecessários para melhorar os tempos de resposta e reduzir a carga no servidor. Isso resulta em um aplicativo mais eficiente, oferecendo uma melhor experiência ao usuário, aumento do engajamento e retenção do usuário e maior escalabilidade do servidor.
Formas de Otimizar Consultas do GraphQL
- N+1 (Carregamento em Lote)
- Over-Fetching e Under-Fetching
- Armazenamento em Cache para Latência Reduzida
- Paginação
Melhorando o Controle de Acesso do GraphQL e a Otimização de Consultas do GraphQL
O mecanismo de autorização valida as permissões de nós e campos usando ACL (lista de controle de acesso) e otimiza as consultas GraphQL com base nas permissões. Além disso, o Resolutor N+1 melhora o desempenho ao consolidar consultas. Essa 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.
- Mecanismo GraphQL: Refere-se a um serviço que permite executar consultas GraphQL.
- Mecanismo de Autorização: Valida as permissões de nós e campos usando ACL e otimiza a consulta GraphQL com base nas permissões dos campos.
- Resolutor N+1: Reduz a sobrecarga e a latência associadas a múltiplas consultas de 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 Fornecedores e Endereços requer autenticação do usuário, que pode ser facilmente gerenciada nos resolutores.
No entanto, os dados do Fornecedor são restritos aos usuários administradores, e alguns campos do fornecedor são acessíveis apenas para funções específicas. Por outro lado, os produtos são públicos e podem ser visualizados com a função de Proprietário do Produto. Executar a consulta mencionada (Figura 3) retornará os dados do produto juntamente com os dados do Fornecedor e do Endereço associados, o que leva a um problema de segurança.
Implementação Aprimorada
Os nós e campos da consulta são validados conforme a permissão do usuário, e a consulta otimizada do GraphQL é 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 então utilizada, junto com a consulta, para validar a autorização.
Neste exemplo, estamos utilizando a função e permissão de um usuário da sessão ou requisição que controla o acesso a consultas e mutações específicas no esquema do GraphQL. Definimos as regras de função e permissão no esquema do GraphQL para todos os usuários.
Este método verifica recursivamente a função e permissão em todos os nós e campos. Se um nó ou campo não for permitido, então 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 do GraphQL é validada em relação ao esquema, este método retornará a consulta otimizada do GraphQL.
Aprimorando a Otimização da Consulta ORM Usando N+1
Implementação Existente
É uma questão técnica que impacta o desempenho de uma consulta. Pode ocorrer em aplicativos que usam um framework de Mapeamento Objeto-Relacional (ORM) para acessar um banco de dados.Normalmente surge quando o aplicativo precisa carregar uma coleção de entidades relacionadas do banco de dados.
Vamos supor que existam 2 produtos; é necessário fazer 1 consulta para recuperar os produtos e mais 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
Ao atingir 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 para uma única consulta para os dados principais e uma consulta adicional para os dados relacionados, mitigando efetivamente o problema N+1.
- Consulta de Dados Principais: Uma única consulta que recupera o conjunto principal de dados necessário para o aplicativo.
- Consulta de Dados Relacionados: Uma consulta adicional buscando quaisquer dados relacionados necessários para completar o conjunto de dados.
Depois que todos os resolvedores de consulta forem concluídos, o servidor retorna os dados otimizados para o cliente em formato JSON.
Conclusão
Nós destacamos que a implementação de mecanismos de autorização detalhados, juntamente com medidas de segurança aprimoradas, é crucial para garantir a segurança de uma API GraphQL. Isso inclui segurança em nível de nó e em nível de campo.
Conforme este artigo descreve, o problema N+1 ocorre quando uma consulta não otimizada gera chamadas excessivas ao banco de dados em GraphQL. Nós fornecemos uma solução para superar o problema N+1. Isso reduz 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 ao reduzir os tempos de resposta da consulta.
Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries