Protege las credenciales de Cloud de tu app para Android que implementa el AA de Firebase

Si tu app para Android usa una de las APIs de Cloud de AA de Firebase, antes de lanzarla a producción, debes tomar algunas medidas adicionales para evitar accesos no autorizados a la API.

Para las apps de producción, asegúrate de que solo los clientes autenticados tengan acceso a los servicios en la nube. Ten presente que solo los dispositivos sin permisos de administrador pueden autenticarse con el método descrito.

Luego, deberás crear una clave de API solo para depuración que puedes usar para tu comodidad durante las pruebas y el desarrollo.

1. Registra tus apps de producción con Firebase

Primero, registra las apps de producción con Firebase.

  1. Asegúrate de tener las firmas SHA-1 de tu app. Consulta cómo autenticar tu cliente y obtén información para hacerlo.

  2. Ve a la configuración del proyecto, , en Firebase console y, luego, selecciona la pestaña Configuración.

  3. Desplázate hacia abajo hasta la tarjeta Tus apps y, luego, selecciona tu app para Android.

  4. Agrega la firma SHA-1 de tu app a la información de la app.

2. Restringe los permisos de las claves de API

A continuación, configura las claves de API existentes para inhabilitar el acceso a la API de Cloud Vision:

  1. Abre la página Credenciales de la consola de Google Cloud. Cuando se te solicite, selecciona tu proyecto.

  2. Para cada clave de API existente en la lista, abre la vista de edición.

  3. En la sección Restricciones de API, selecciona Restringir clave y, luego, agrega a la lista todas las APIs a las que deseas que tenga acceso la clave de API. Asegúrate de no incluir la API de Cloud Vision.

    Cuando configuras las restricciones de API de una clave de API, declaras en forma explícita las APIs a las que tiene acceso la clave. De forma predeterminada, cuando la sección Restricciones de API tiene seleccionada la opción No restringir clave, se puede usar una clave de API a fin de acceder a cualquier API que esté habilitada para el proyecto.

Ahora tus claves de API existentes no otorgarán acceso a servicios de AA de la nube, pero cada clave seguirá funcionando para las APIs que hayas agregado a su lista Restricciones de API.

Ten en cuenta que, si habilitas más APIs en el futuro, deberás agregarlas a la lista Restricciones de API de la clave de API correspondiente.

3. Crea y usa una clave de API solo para depuración

Por último, crea una clave de API nueva y úsala solamente en el desarrollo. El AA de Firebase puede usar esta clave de API para acceder a los servicios de Google Cloud en entornos donde la autenticación de la app no está disponible, por ejemplo, cuando se ejecuta en emuladores.

  1. Para crear una nueva clave de API y usarla en el desarrollo, haz lo siguiente:

    1. Abre la página Credenciales de la consola de Google Cloud. Cuando se te solicite, selecciona tu proyecto.

    2. Haz clic en Crear credenciales > Clave de API y anota la nueva clave de API. Esta clave habilita el acceso a la API desde apps no autenticadas, por lo tanto, no la compartas.

  2. Para asegurarte de que la nueva clave de API de depuración no se haya filtrado con la aplicación que lanzaste, especifica la clave de API de depuración en un archivo de manifiesto de Android que se utiliza solo para compilaciones de depuración:

    1. Si aún no tienes un manifiesto de depuración, debes crear uno. Para ello, haz clic en File > New > Other > Android Manifest File y selecciona debug en los conjuntos de orígenes de destino.

    2. Agrega la siguiente declaración en el manifiesto de depuración:

      <application>
      <meta-data
          android:name="com.firebase.ml.cloud.ApiKeyForDebug"
          android:value="your-debug-api-key" />
      </application>
      
  3. En tu app, configura el AA de Firebase a fin de usar la coincidencia de la huella digital del certificado para autenticar a tu cliente en producción y usar las claves de API, es decir, la clave de depuración, solo en las compilaciones de depuración:

    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óximos pasos

Consulta la lista de tareas del lanzamiento a fin de obtener información sobre cómo preparar tu app para lanzarla si usas otras funciones de Firebase.