2
respostas

Definir políticas de acesso aos dados

Como eu faria um serviço baseado em permissões? Imagine que determinados dados só podem ser acessados por alguns perfis.

Vou ilustrar:

No nosso exemplo da pet shop temos uma api que pode ser usada em sistemas internos da petshop e pelos clientes. Eu não quero, por exemplo, que os clientes acessem dados de outros clientes.

Como você resolveria isso?

Pq a forma como as pessoas vendem o GraphQL é justamente esquecer o "Backend4Frontend" e disponibilizar o domínio para que cada um consuma o que lhe interessar.

2 respostas

Boa tarde, Edgar! Tudo bom?

Para isso, podemos usar resolvers :) Vou deixar alguns links bem legas sobre segurança aqui e a parte authorizations da documentação do GraphQL. Acho que sobre a sua dúvida especificamente, authorizations já resolvem bem.

Qualquer dúvida, só chamar! Gosto bastante dessas discussões, então qualquer coisa estou à disposição o/

Sobre authorization: https://graphql.org/learn/authorization/ https://medium.com/planes-agency/how-to-survive-a-penetration-test-as-a-graphql-developer-2759cababf8e

Sobre segurança das queries: https://www.howtographql.com/advanced/4-security/ https://blog.apollographql.com/securing-your-graphql-api-from-malicious-queries-16130a324a6b https://graphqlmastery.com/blog/graphql-security-in-node-js-project

Abraços

Boa noite Edgar, tudo bom? Bem eu para fazer esse tipo de validação usei o GraphQL Shield é uma biblioteca bem legal e fácil de mexer, onde você define as regras de acesso de acordo com o que você quer. Por exemplo no meu caso eu so fiz uma regra por enquanto, que só podem fazer executar query quem estiver autenticado.

import { rule } from 'graphql-shield';
import { getSellerId, Context } from '../utils';

const rules = {
  isAuthenticatedSeller: rule()(
    async (parent, args, ctx: Context): Promise<boolean> => {
      const sellerId = getSellerId(ctx);

      if (sellerId) {
        const sellerExist = await ctx.prisma.$exists.seller({ id: sellerId });
        return sellerExist;
      }

      return false;
    },
  ),
};

export const Query = rules.isAuthenticatedSeller;

O que eu faço nesse código, crio um objeto rules onde eu tenho um atributo chamado isAutheticatedSeller, onde faço umas validações, e retorno um booleano, e no final eu exporto falando que todas as query's precisam de que o usuário esteja autenticado.

Tem um tutorial bem legal traduzido para portugues que fizeram que ilustra bem essa biblioteca.

GraphQL Shield - https://github.com/maticzav/graphql-shield

Tutorial - https://medium.com/@oieduardorabelo/graphql-conhecendo-o-graphql-shield-208edb45d3cf

OBS: Eu to usando Prisma como servidor de ORM, ele tbm opera usando GraphQL, entao voce nao precisa fazer tudo na mao os crud's, criar as tabelas, tudo mais prático. Link da documentação caso queria dar uma olhada e saber mais https://www.prisma.io/

Abraços.