Como adicionar a verificação de licenças do lado do servidor ao app

Para confirmar a compra ou o download de uma cópia legítima do seu app na Google Play Store, é melhor realizar a verificação da licença em um servidor controlado por você.

Este guia apresenta um processo passo a passo para a verificação da licença do lado do servidor e algumas práticas recomendadas relacionadas a essa verificação.

Visão geral do processo

A Figura 1 mostra como as informações são transferidas entre seu app, o Google Play e seu servidor particular:

Diagrama de fluxo de dados
Figura 1. Fluxo de dados entre o app e o Google Play e, em seguida, entre o app e o servidor particular.
  1. Seu app consulta o Google Play sobre a compra ou o download de uma cópia legítima dele feita por um determinado usuário.
  2. O Google Play responde enviando um objeto de dados de resposta, um objeto do tipo ResponseData, para o app. Esse objeto é uma informação assinada que informa se o usuário comprou ou fez o download de uma cópia legítima do app.
  3. Seu app faz uma solicitação a um servidor particular controlado por você, verificando o conteúdo dos dados de resposta.
  4. O servidor responde enviando um status para o app, indicando se o usuário realmente comprou ou fez o download de uma cópia legítima. Se o servidor enviar a mensagem "sucess", verifique a resposta e, então, conceda ao usuário acesso aos recursos que exigem uma licença.

Como os dados de resposta são assinados pelo Google Play e verificados no seu servidor, não é possível modificar o objeto no dispositivo que executa o app. Se o app depender do servidor e disponibilizar recursos apenas para usuários legítimos, ele ficará substancialmente mais protegido contra usuários não autorizados.

As seções a seguir oferecem outras considerações para a verificação da licença do servidor.

Proteger contra ataques de repetição

Depois de receber uma resposta do Google Play sobre o status da licença, o usuário pode copiar os dados de resposta e usá-los várias vezes ou fornecê-los a outros usuários, que podem fazer as próprias solicitações ao servidor particular do seu app. Esse tipo de ação é conhecido como ataque de repetição.

Para reduzir a probabilidade de usuários realizarem ataques de repetição, tome as seguintes medidas antes de enviar uma solicitação para o servidor do app:

  • Verifique no carimbo de data/hora incluído nos dados de resposta para garantir que o Google Play gerou a resposta recentemente.

  • Faça a limitação de taxa na solicitação do servidor, como espera exponencial, para reduzir o número de vezes que o app tenta enviar os mesmos dados de resposta ao servidor.

  • Antes de verificar o conteúdo dos dados de resposta do Google Play no seu servidor particular, envie a ele uma solicitação inicial baseada em autenticação. Nessa primeira solicitação, envie credenciais de usuário para o servidor e faça com que ele responda com um valor de uso único, ou seja, um número que possa ser usado apenas uma vez. Em seguida, você pode incluir esse valor na próxima solicitação para o servidor particular, solicitando dados de verificação de licença. Para saber mais sobre como escolher um bom valor de uso único, consulte a seção Gerar um valor de uso único adequado.

Gerar um valor de uso único adequado

Use uma das técnicas a seguir para criar um valor de uso único difícil de adivinhar:

  • Gere um valor hash com base no ID do usuário.
  • Gere um valor aleatório por usuário. Armazene esse valor aleatório no servidor do app como parte dos atributos de um determinado usuário.

Verificar dados de resposta do servidor

Ao analisar os dados de resposta enviados pelo servidor do app, verifique se a resposta da License Verification Library não foi forjada. Verifique a assinatura incluída nos dados de resposta do servidor do app comparando-a com a chave que o app recebeu do Google Play em uma etapa anterior.

Vale lembrar também que o bloco específico da License Verification Library (LVL, na sigla em inglês) é a única parte assinada. Portanto, é a única parte confiável dos dados de resposta do servidor.