Validando seus documentos do Sync Gateway com o synctos

Ao criar qualquer sistema com componentes de cliente e servidor, é fundamental validar os dados que o cliente tenta armazenar no servidor e garantir que somente as pessoas autorizadas possam visualizá-los ou modificá-los. Caso contrário, um cliente mal-intencionado pode se aproveitar do seu sistema para fazer todo tipo de coisa desagradável. É por isso que, quando nós da Kashoo começamos a usar o Couchbase Mobile e o Sync Gateway para sincronizar dados entre vários dispositivos móveis e nosso aplicativo da Web, criamos nossas funções de sincronização para executar uma validação abrangente de todas as propriedades do documento e as permissões (ou seja, canais) que seriam necessárias para ler, criar, substituir e excluir.

Compartilhe este artigo

Nosso Comunidade Postagem de convidado vem de Joel AndrewsJoel é um desenvolvedor poliglota que vive na chuvosa costa oeste do Canadá. Ele desempenha várias funções na Kashoo, incluindo desenvolvedor de back-end, administrador de banco de dados, desenvolvedor de DevOps, proprietário de produto e, ocasionalmente, desenvolvedor de front-end para Web e Android. Ele tem um amor profundo e permanente por Couchbase (especialmente Couchbase Mobile), o que o torna completamente imparcial ao discutir os prós e os contras de qualquer solução de armazenamento de dados.

Ao criar qualquer sistema com componentes de cliente e servidor, é fundamental validar os dados que o cliente tenta armazenar no servidor e garantir que somente as pessoas autorizadas possam visualizá-los ou modificá-los. Caso contrário, um cliente mal-intencionado pode se aproveitar do seu sistema para fazer todo tipo de coisa desagradável. É por isso que, quando nós da Kashoo começamos a usar o Couchbase Mobile e o Sync Gateway para sincronizar dados entre vários dispositivos móveis e nosso aplicativo da Web, criamos nossas funções de sincronização para executar uma validação abrangente de todas as propriedades do documento e as permissões (ou seja, canais) que seriam necessárias para ler, criar, substituir e excluir.

A flexibilidade do API da função de sincronização do Sync Gateway pode ser tanto uma bênção quanto uma maldição. Descobrimos que, ao começar com um bucket simples que tinha apenas alguns tipos de documentos, não era muito difícil manter as coisas organizadas e passíveis de manutenção e, ao mesmo tempo, realizar uma boa quantidade de validação. No entanto, à medida que adicionávamos mais e mais tipos de documentos, o tamanho e a complexidade da nossa função de sincronização rapidamente saíram do controle. Escrever uma função de sincronização que execute uma validação abrangente torna-se cada vez mais incontrolável quanto mais tipos de documentos você adicionar... isto é, a menos que você comece a aplicar alguma estrutura ao código.

Isso nos levou a dividir a função de sincronização do nosso banco de dados Sync Gateway em quatro fases principais:

  1. Descubra o tipo de documento

  2. Verifique se o usuário pertence a um dos canais necessários para realizar a operação

  3. Validar cada uma das propriedades do documento

  4. Atribuir canais ao documento

Isso funcionou bem até introduzirmos um segundo banco de dados Sync Gateway. Como as funções de sincronização são definidas como um único bloco de código sem a capacidade de carregar dinamicamente bibliotecas externas, duplicamos a estrutura aproximada que havíamos criado para a função de sincronização do primeiro banco de dados na função de sincronização do segundo banco de dados. No entanto, como desenvolvedores, essa duplicação de código não nos agradou muito, pois significava que, à medida que fizéssemos melhorias em uma função de sincronização, teríamos que portar manualmente essas alterações para a outra ou elas se distanciariam gradualmente uma da outra em termos de funcionalidade.

Assim, decidimos evoluir ainda mais a estrutura aproximada para uma ferramenta autônoma que pode ser compartilhada entre bancos de dados do Sync Gateway sem exigir duplicação de código. Como a API da função de sincronização do Sync Gateway não permite o uso de bibliotecas externas, adotamos a abordagem de geração de código em vez de vinculação dinâmica: você escreve as definições do tipo de documento como objetos JavaScript e, em seguida, usa o utilitário para importar essas definições em um modelo pré-gerado para criar uma função de sincronização coesa e independente.

Agora, tínhamos uma maneira de definir nossos tipos de documentos (ou "esquema") de uma forma muito declarativa, mais próxima de escrever uma configuração do que de escrever um código, e onde as definições de tipos de documentos podem ser mantidas de forma totalmente independente do código que realmente executa a autorização, a validação e a atribuição de canais. Isso eliminou grande parte da duplicação de código que era necessária anteriormente. E funcionou muito bem para nós. Funcionou tão bem, de fato, que decidimos liberação e apoiar o utilitário como software de código aberto para que outros não precisem duplicar nossos esforços. O utilitário chama-se synctos e já está disponível para uso sob a licença MIT altamente permissiva.

Desde seu lançamento inicial, também expandimos seus recursos, de modo que agora ele executa cinco fases, em vez das quatro originais, e cada fase é significativamente mais robusta:

  1. Descubra o tipo de documento

  2. Autorizar o usuário, determinando se

    1. o usuário pertence a um dos canais necessários para realizar a operação

    2. o usuário pertence a uma das funções necessárias para executar a operação

    3. o usuário recebeu explicitamente permissão para realizar a operação

  3. Validar cada uma das propriedades do documento

  4. Atribuir acesso:

    1. adicionar usuários e/ou funções aos canais

    2. adicionar usuários a funções

  5. Atribuir canais ao documento

Aqui está um exemplo de definição de tipo de documento para lhe dar uma ideia do que o synctos é capaz de fazer:

É fácil começar a usar o synctos usando npm (o gerenciador de pacotes para o Node.js). Execute o seguinte em um diretório vazio:

Isso fará o download da versão mais recente do synctos para o diretório local node_modules. E, agora que o synctos foi baixado, se você salvar o exemplo de definições de documentos acima em um arquivo chamado "example-doc-definitions.js", poderá usar o synctos para gerar uma função de sincronização a partir dele:

node_modules/synctos/make-sync-function ./example-doc-definitions.js ./example-generated-sync-function.js

Isso deve ter criado uma função de sincronização totalmente autônoma, combinando o modelo predefinido do synctos com as definições de documento que você forneceu, como você verá se abrir "example-generated-sync-function.js" em um editor de texto. A função de sincronização gerada pode então ser inserida literalmente em um arquivo de configuração do Sync Gateway.

Veja a seguir um exemplo simples de configuração do Sync Gateway que usa uma instância na memória do Morsa para que você possa experimentar a função de sincronização sem precisar configurar um bucket do Couchbase Server. Substitua a string "%GENERATED_SYNC_FUNCTION%" com a função de sincronização que foi gerada na etapa anterior. Observe que os pontos e aspas (`) que cercam a função de sincronização são uma adição personalizada ao formato JSON que permite cadeias de caracteres de várias linhas em um Sync Gateway arquivo de configuração.

Salve a configuração do Sync Gateway acima como "example-sync-gateway-config.json" e, em seguida, inicie o Sync Gateway com a nova configuração:

Criar um documento válido é ótimo, mas o que acontece se tentarmos substituir esse documento por outro que viole a definição do documento? Observe que, no exemplo a seguir, o valor da propriedade "businessId" foi modificado de seu valor original de 15; isso é um problema porque a propriedade foi marcada como "imutável" na definição do documento.

A resposta será um erro:

 

Como você pode ver, o synctos gera mensagens de erro detalhadas que facilitam a determinação do que deu errado ao tentar escrever uma revisão de documento. Este é um exemplo simples com apenas um erro de validação, mas se o documento contivesse vários erros, cada erro adicional seria enumerado na mensagem de erro da resposta.

E se tentarmos executar uma operação que exija um canal ao qual nosso usuário não pertence? Lembre-se de que o usuário que definimos na configuração do Sync Gateway não pertence ao canal "remove-payment-requisition", portanto não deve ter permissão para remover o documento que criamos anteriormente.

 

Há muito mais no synctos (por exemplo, atribuir acesso a usuários e funções, executar ações personalizadas após cada fase da função de sincronização e validar as funções de sincronização geradas usando o módulo de teste integrado), mas esperamos que isso tenha lhe dado uma ideia do que ele é capaz de fazer e de como pode ajudá-lo a escrever funções de sincronização do Sync Gateway que validem seus documentos de forma abrangente. Consulte a documentação do projeto em GitHub ou npm para obter muito mais detalhes.

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Laura Czajkowski, gerente da comunidade de desenvolvedores, Couchbase

Laura Czajkowski é a Snr. Developer Community Manager da Couchbase, supervisionando a comunidade. Ela é responsável pelo nosso boletim informativo mensal para desenvolvedores.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.