Proteger suas credenciais da nuvem do Firebase ML em apps Android

Se o app Android usa uma das APIs de nuvem do Firebase ML, antes de lançar seu app na produção, é preciso tomar algumas medidas adicionais para impedir o acesso não autorizado à API.

Para seus aplicativos de produção, você garantirá que apenas clientes autenticados possam acessar os serviços de nuvem. Observe que somente dispositivos sem acesso root podem se autenticar com o método descrito.

Em seguida, você vai criar uma chave de API somente para depuração que poderá ser usada por conveniência durante o teste e o desenvolvimento.

1. Registre seus apps de produção com o Firebase

Primeiro, registre seus aplicativos de produção usando o Firebase.

  1. Verifique se você tem as assinaturas SHA-1 do seu aplicativo. Consulte Como autenticar seu cliente para saber como fazer isso.

  2. Acesse as Configurações do projeto no console do Firebase e selecione a guia Configurações.

  3. Role a tela para baixo até o card Seus apps e selecione seu app Android.

  4. Adicione a assinatura SHA-1 do seu app às informações dele.

2. Restrinja o escopo das suas chaves de API

Em seguida, configure suas chaves de API existentes para proibir o acesso à API Cloud Vision:

  1. Abra a página Credenciais do console do Google Cloud. Quando solicitado, selecione o projeto.

  2. Para cada chave de API na lista, abra a visualização de edição.

  3. Na seção Restrições da API, selecione Restringir chave e adicione à lista todas as APIs que precisam ter acesso liberado para a chave. Não inclua a API Cloud Vision.

    Ao configurar as restrições de API de uma chave, você declara explicitamente quais APIs a chave pode acessar. Por padrão, quando a seção Restrições da API tiver a opção Não restringir a chave selecionada, uma chave de API poderá ser usada para acessar qualquer API ativada para o projeto.

Agora as chaves de API não concederão acesso aos serviços de ML na nuvem, mas todas elas continuarão funcionando para as APIs adicionadas à lista de restrições de API.

Se você ativar mais APIs no futuro, precisará adicioná-las à lista de restrições de API para a chave em questão.

3. Crie e use uma chave de API somente para depuração

Por fim, crie uma nova chave de API que será usada apenas para desenvolvimento. O Firebase ML pode usar essa chave de API para acessar serviços Google Cloud em ambientes em que a autenticação de apps não é possível, como quando executado em emuladores.

  1. Crie uma nova chave de API a ser usada para desenvolvimento:

    1. Abra a página Credenciais do console do Google Cloud. Quando solicitado, selecione o projeto.

    2. Clique em Criar credenciais > Chave de API e anote a nova chave de API. Ela permite o acesso à API por aplicativos não autenticados. Por isso, mantenha essa chave em segredo.

  2. Para garantir que a nova chave de API de depuração não vaze com o lançamento do app, especifique essa chave em um arquivo de manifesto do Android usado apenas para builds de depuração:

    1. Se você ainda não tiver um manifesto de depuração, crie um clicando em Arquivo > Novo > Outro > Arquivo de manifesto do Android e selecionando debug nos conjuntos de origem desejados.

    2. No manifesto de depuração, adicione a seguinte declaração:

      <application>
      <meta-data
          android:name="com.firebase.ml.cloud.ApiKeyForDebug"
          android:value="your-debug-api-key" />
      </application>
  3. No seu app, configure o Firebase ML para usar a correspondência de impressões digitais do certificado para autenticar seu cliente na produção e para usar chaves de API, no caso, a chave de depuração, somente em builds de depuração:

    Kotlin+KTX

    val optionsBuilder = FirebaseVisionCloudImageLabelerOptions.Builder()
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch()
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f)
    // ...
    
    // And lastly:
    val options = optionsBuilder.build()
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage)

    Java

    FirebaseVisionCloudImageLabelerOptions.Builder optionsBuilder =
            new FirebaseVisionCloudImageLabelerOptions.Builder();
    if (!BuildConfig.DEBUG) {
        // Requires physical, non-rooted device:
        optionsBuilder.enforceCertFingerprintMatch();
    }
    
    // Set other options. For example:
    optionsBuilder.setConfidenceThreshold(0.8f);
    // ...
    
    // And lastly:
    FirebaseVisionCloudImageLabelerOptions options = optionsBuilder.build();
    FirebaseVision.getInstance().getCloudImageLabeler(options).processImage(myImage);

Próximas etapas

Consulte a checklist de lançamento para mais informações sobre como preparar seu app para o lançamento ao usar outros recursos do Firebase.