Catch up on everything we announced at this year's Firebase Summit. Learn more

Proteger suas credenciais da nuvem do Firebase ML em apps para Android

Se o aplicativo para Android usa uma das APIs de nuvem do Firebase ML, antes de lançar seu aplicativo 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ê criará uma chave de API somente de depuração que poderá ser usada por conveniência durante o teste e o desenvolvimento.

1. Registre seus aplicativos 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 devem 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 atuais não concederão acesso aos serviços de ML na nuvem, mas todas elas continuarão funcionando nas 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 de 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 do Google Cloud em ambientes em que não é possível autenticar apps, 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. Essa chave permite o acesso à API por aplicativos não autenticados e, portanto, 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 aplicativo, especifique a chave da API de depuração em um arquivo de manifesto do Android usado apenas para compilações 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 de destino.

    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 aplicativo, configure o Firebase ML para usar a correspondência de impressão digital de certificado para autenticar seu cliente na produção e usar chaves de API, no caso a chave de depuração, somente em compilações de depuração:

    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);

    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)

Próximos passos

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