Verificación de aplicaciones de Firebase para plataformas de Apple

1. Introducción

La Verificación de aplicaciones de Firebase garantiza que las solicitudes provengan de apps y dispositivos legítimos para proteger tus recursos de backend contra todo tipo de abusos, como fraudes de facturación y suplantación de identidad (phishing). Funciona con servicios de Firebase y tus propios servicios de backend para proteger tus recursos.

Para obtener más información sobre la Verificación de aplicaciones de Firebase, consulte la documentación de Firebase.

La Verificación de aplicaciones usa servicios específicos de la plataforma para verificar la integridad de una app o un dispositivo. Estos servicios se denominan proveedores de certificación. Uno de esos proveedores es el servicio App Attest de Apple, que la Verificación de aplicaciones puede usar para verificar la autenticidad de las apps y los dispositivos de Apple.

Qué compilarás

En este codelab, agregarás y aplicarás la Verificación de aplicaciones en una aplicación de ejemplo existente para proteger Realtime Database del proyecto contra el acceso de apps y dispositivos ilegítimos.

Qué aprenderás

  • Cómo agregar la Verificación de aplicaciones de Firebase a una aplicación existente
  • Cómo instalar diferentes proveedores de certificación de la Verificación de aplicaciones de Firebase
  • Cómo configurar App Attest para tu app
  • Cómo configurar el proveedor de certificación de depuración para probar tu app en simuladores durante su desarrollo

Requisitos

  • Xcode 13.3.1 o una versión posterior
  • Una cuenta de desarrollador de Apple que te permita crear nuevos identificadores de apps
  • Un dispositivo iOS o iPadOS compatible con App Attest (obtén más información sobre la disponibilidad de la API de App Attest).

2. Obtén el proyecto inicial

El repositorio de guías de inicio rápido de Firebase para iOS contiene apps de ejemplo que muestran diferentes productos de Firebase. Usarás la app de inicio rápido de Firebase Database para SwiftUI como base para este codelab.

Clona el repositorio de guías de inicio rápido de Firebase para iOS desde la línea de comandos:

git clone https://github.com/firebase/quickstart-ios.git
cd quickstart-ios

Abre el proyecto de la app de inicio rápido de SwiftUI de Realtime Database en Xcode:

cd database/DatabaseExampleSwiftUI/DatabaseExample
xed .

3. Agrega la Verificación de aplicaciones a la app

  1. Espera a que Swift Package Manager resuelva las dependencias del proyecto.
  2. Abre la pestaña General del destino de la app DatabaseExample (iOS). Luego, en la sección Marcos de trabajo, bibliotecas y contenido incorporado, haz clic en el botón +.
  3. Selecciona para agregar FirebaseAppCheck.

4. Crea e instala la fábrica del proveedor de la Verificación de aplicaciones

  1. En el grupo de archivos Shared, agrega un grupo nuevo llamado AppCheck.
  2. Dentro de este grupo, crea una clase de fábrica en un archivo separado, p.ej., MyAppCheckProviderFactory.swift y asegúrate de agregarlo al destino DatabaseExample (iOS):
    import Firebase
    
    class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
      func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
        #if targetEnvironment(simulator)
          // App Attest is not available on simulators.
          // Use a debug provider.
          return AppCheckDebugProvider(app: app)
        #else
          // Use App Attest provider on real devices.
          return AppAttestProvider(app: app)
        #endif
      }
    }
    
  3. A continuación, en DatabaseExampleApp.swift, asegúrate de importar FirebaseAppCheck y establecer una instancia de la clase MyAppCheckProviderFactory como la fábrica del proveedor de la Verificación de aplicaciones.
    import SwiftUI
    import FirebaseCore
    import FirebaseAppCheck
    
    @main
    struct DatabaseExampleApp: App {
      init() {
        // Set an instance of MyAppCheckProviderFactory as an App Check
        // provider factory before configuring Firebase.
        AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
        FirebaseApp.configure()
      }
      ...
    }
    

5. Crea y configura un proyecto de Firebase

Para usar la Verificación de aplicaciones en tu proyecto de iOS, debes seguir estos pasos en Firebase console:

  • Configurar un proyecto de Firebase
  • Agrega tu app para iOS al proyecto de Firebase.
  • Configura Firebase Authentication.
  • Inicializa la instancia de Realtime Database que vas a proteger.
  • Configura la Verificación de aplicaciones.

Crea un proyecto

Primero, debes crear un proyecto de Firebase.

  1. En Firebase console, selecciona Agregar proyecto.
  2. Asigna el nombre App Check Codelab a tu proyecto.
  3. Haz clic en Continuar.
  4. Inhabilita Google Analytics para este proyecto y, luego, haz clic en Crear proyecto.

Crea una instancia de Realtime Database

Ahora, ve a la sección Realtime Database de Firebase console.

  1. Haz clic en el botón Crear base de datos para iniciar el flujo de trabajo de creación de la base de datos.
  2. Deja la ubicación predeterminada (us-central1) de la base de datos y haz clic en Siguiente.
  3. Asegúrate de que Modo bloqueado esté seleccionado y haz clic en el botón Habilitar para habilitar las reglas de seguridad de tu base de datos.
  4. Ve a la pestaña Reglas del navegador de Realtime Database y reemplaza las reglas predeterminadas por lo siguiente:
    {
        "rules": {
            // User profiles are only readable/writable by the user who owns it
            "users": {
                "$UID": {
                    ".read": "auth.uid == $UID",
                    ".write": "auth.uid == $UID"
                }
            },
            // Posts can be read by anyone but only written by logged-in users.
            "posts": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    // UID must match logged in user and is fixed once set
                    "uid": {
                        ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                    },
                    // User can only update own stars
                    "stars": {
                        "$UID": {
                            ".validate": "auth.uid == $UID"
                        }
                    }
                }
            },
            // User posts can be read by anyone but only written by the user that owns it,
            // and with a matching UID
            "user-posts": {
                ".read": true,
                "$UID": {
                    "$POSTID": {
                        ".write": "auth.uid == $UID",
                        ".validate": "data.exists() || newData.child('uid').val() == auth.uid"
                    }
                }
            },
            // Comments can be read by anyone but only written by a logged in user
            "post-comments": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    "$COMMENTID": {
                        // UID must match logged in user and is fixed once set
                        "uid": {
                            ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                        }
                    }
                }
            }
        }
    }
    
  5. Haz clic en el botón Publicar para activar las reglas de seguridad actualizadas.

Prepara tu app para iOS para que se conecte a Firebase

Para poder ejecutar la app de ejemplo en un dispositivo físico, debes agregar el proyecto a tu equipo de desarrollo para que Xcode pueda administrar el perfil de aprovisionamiento requerido. Sigue estos pasos para agregar la app de ejemplo a tu cuenta de desarrollador:

  1. En Xcode, selecciona el proyecto DatabaseExample en el navegador de proyectos.
  2. Selecciona el destino DatabaseExample (iOS) y abre la pestaña Signing & Capabilities.
  3. Deberías ver un mensaje de error que diga "Signing for DatabaseExample (iOS) requires a Development Team.
  4. Actualiza el identificador de paquete a un identificador único. La forma más sencilla de lograrlo es utilizar el nombre de dominio inverso de tu sitio web, por ejemplo, com.acme.samples.firebase.quickstart.DatabaseExample (no uses este ID; elige tu propio ID único).
  5. Selecciona tu equipo de desarrollo.
  6. Sabrás que todo salió bien cuando Xcode muestre “Perfil de aprovisionamiento: Perfil administrado de Xcode” y un ícono de información junto a la etiqueta. Si haces clic en este ícono, se mostrarán más detalles sobre el perfil de aprovisionamiento.

Conecta tu app para iOS

Para obtener una explicación detallada de cómo conectar tu app, consulta la documentación sobre cómo agregar Firebase a tu proyecto de iOS. Para comenzar, sigue estos pasos principales en Firebase console:

  1. Desde la pantalla Descripción general del proyecto de tu proyecto nuevo, haz clic en el botón + Agregar app y, luego, en el ícono de iOS+ para agregar una nueva app para iOS a tu proyecto de Firebase.
  2. Ingresa el ID del paquete de tu app (usa el que definiste en la sección anterior, como com.acme.samples.firebase.quickstart.DatabaseExample; recuerda que este debe ser un identificador único)
  3. Haga clic en Registrar app.
  4. Firebase genera un archivo GoogleService-Info.plist que contiene todos los metadatos necesarios para la app.
  5. Haz clic en Download GoogleService-Info.plist para descargar el archivo.
  6. En Xcode, verás que el proyecto ya contiene un archivo llamado GoogleService-Info.plist. Primero borra este archivo. En el próximo paso, lo reemplazarás por el de tu proyecto de Firebase.
  7. Copia el archivo GoogleService-Info.plist que descargaste en el paso anterior en la carpeta raíz de tu proyecto de Xcode, agrégalo al destino DatabaseExample (iOS) y asegúrate de que se llame GoogleService-Info.plist
  8. Haz clic para avanzar por los pasos restantes del flujo de registro. Dado que el proyecto de muestra ya está configurado correctamente, no es necesario que realices ningún cambio en el código.

Configure Firebase Authentication

¡Vaya! Hasta ahora, la configuración es bastante simple, pero ten paciencia. Si eres nuevo en Firebase, has visto partes esenciales de un flujo de trabajo que pronto conocerás.

Ahora, configurarás Firebase Authentication para esta app.

Habilitar el proveedor de acceso con correo electrónico y contraseña de autenticación

  1. En Firebase console, abre la sección Authentication de la consola.
  2. Haz clic en Comenzar para configurar Firebase Authentication en tu proyecto.
  3. Selecciona la pestaña Método de acceso.
  4. Selecciona Correo electrónico/Contraseña en la sección Proveedores nativos.
  5. Habilita Correo electrónico/Contraseña y haz clic en Guardar.

Cómo agregar un usuario de prueba

  1. Abre la pestaña Usuarios de la sección Autenticación.
  2. Haz clic en Agregar usuario.
  3. Especifica un correo electrónico y una contraseña para el usuario de prueba y, luego, haz clic en Agregar usuario.

Prueba la app

Regresa a Xcode y ejecuta la aplicación en el simulador de iOS. Accede con el correo electrónico y la contraseña del usuario de prueba que acabas de crear. Una vez que hayas accedido, crea una publicación, publica un comentario en una publicación existente y destaca o deja de destacar las publicaciones.

6. Configura un proveedor de certificación de App Attest

En este paso, configurarás la Verificación de aplicaciones para que use el proveedor de App Attest en Firebase console.

  1. En Firebase console, navega a la sección Verificación de aplicaciones de la consola.
  2. Haz clic en Comenzar.
  3. En la pestaña Apps, haz clic en tu app para expandir sus detalles.
  4. Haz clic en App Attest para configurar App Attest y, luego, ingresa el ID del equipo de tu cuenta de desarrollador de Apple (puedes encontrarlo en la sección Membresía del portal para desarrolladores de Apple): 1645f7a369b678c2.png
  5. Haz clic en Guardar.

De esta manera, tiene un proyecto de Firebase en funcionamiento que está conectado a nuestra aplicación nueva y se habilita la Verificación de aplicaciones.

Ya puedes configurar nuestro servicio de certificación específico. Para obtener más información sobre este flujo de trabajo, consulta Habilita la Verificación de aplicaciones mediante App Attest en iOS.

7. Configura App Attest para tu aplicación

Ahora es momento de comenzar a usar el SDK de Verificación de aplicaciones de Firebase y de implementar algún código de cliente.

Primero, debes configurar el proyecto de Xcode para que el SDK pueda usar la API de App Attest de Apple y asegurarte de que las solicitudes enviadas desde la app provengan de instancias legítimas de ella.

  1. Agrega la función App Attest para el destino de tu app en el proyecto de Xcode:
  2. Abre la pestaña Signing & Capabilities en la configuración de destino de tu app.
  3. Haz clic en el botón “+
  4. En el cuadro de diálogo, busca y selecciona la función App Attest. ae84cd988a5fab31.png
  5. Aparecerá un archivo DatabaseExample (iOS).entitlements en la carpeta raíz de tu proyecto de Xcode después de realizar el paso anterior.
  6. En el archivo DatabaseExample (iOS).entitlements, cambia el valor de la clave App Attest Environment a production..

Una vez que completes estos pasos e inicies la app en un dispositivo iOS físico (iPhone o iPad), la app aún podrá acceder a Realtime Database. En un paso posterior, aplicarás la Verificación de aplicaciones, lo que bloqueará las solicitudes que se envíen desde aplicaciones y dispositivos ilegítimos.

Para obtener más información sobre este flujo de trabajo, consulta Habilita la Verificación de aplicaciones mediante App Attest en iOS.

8. Cómo configurar un proveedor de certificación de depuración para el simulador de iOS

El proveedor de Depuración de la Verificación de aplicaciones de Firebase permite probar aplicaciones con la aplicación forzosa de la Verificación de aplicaciones de Firebase en entornos que no son de confianza, incluido el simulador de iOS, durante el proceso de desarrollo. A continuación, debes configurar el proveedor de depuración juntos.

Instala el proveedor de depuración de Firebase en tu app.

Opción 1: Crea condicionalmente una instancia del proveedor de depuración en tu fábrica

Hiciste la mayor parte de esto cuando creaste la fábrica del proveedor de la Verificación de aplicaciones. En este paso, agregarás el registro del secreto de depuración local generado por el proveedor de depuración, de modo que puedas registrar esta instancia de la app en Firebase console con fines de depuración.

Actualiza MyAppCheckProviderFactory.swift con el siguiente código:

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
    // App Attest is not available on simulators.
    // Use a debug provider.
    let provider = AppCheckDebugProvider(app: app)

    // Print only locally generated token to avoid a valid token leak on CI.
    print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

    return provider
#else
    // Use App Attest provider on real devices.
    return AppAttestProvider(app: app)
#endif
  }
}

Este enfoque nos da más flexibilidad para configurar la Verificación de aplicaciones según el entorno. Por ejemplo, puedes usar otros proveedores de certificación, como DeviceCheck, o un proveedor de certificación personalizado, en las versiones del SO en las que App Attest no está disponible. Consulta el ejemplo siguiente:

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
      #if targetEnvironment(simulator)
      // App Attest is not available on simulators.
      // Use a debug provider.
      let provider = AppCheckDebugProvider(app: app)

      // Print only locally generated token to avoid a valid token leak on CI.
      print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

      return provider
      #else
      if #available(iOS 14.0, *) {
        // Use App Attest provider on real devices.
        return AppAttestProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

Opción 2: Instala AppCheckDebugProviderFactory

En casos más sencillos, puedes instalar de manera temporal o condicional el AppCheckDebugProviderFactory antes de configurar la instancia de aplicación de Firebase:

init() {
#if targetEnvironment(simulator)
  let providerFactory = AppCheckDebugProviderFactory()
#else
  let providerFactory = MyAppCheckProviderFactory()
#endif

  AppCheck.setAppCheckProviderFactory(providerFactory)

  FirebaseApp.configure()
}

Esto te ahorrará algunas líneas de código cuando crees tu propia fábrica del proveedor de la Verificación de aplicaciones.

Registra tu secreto de depuración en Firebase console

Obtén el secreto de depuración del simulador de iOS

  1. Si elegiste instalar AppCheckDebugProviderFactory (opción 2 anterior), debes habilitar el registro de depuración para tu app agregando -FIRDebugEnabled a los argumentos de inicio de la app: f1c6b477a373e144.png.
  2. Cómo ejecutar tu app en un simulador
  3. Busca el secreto de depuración en la consola de Xcode. Puedes usar el filtro de la consola para encontrarlo más rápido: d4c65af93e369c55.png

Nota: El secreto de depuración se genera para tu simulador la primera vez que se inicia la app y se almacena en los valores predeterminados del usuario. Si quitas la app, restableces el simulador o usas otro simulador, se generará un nuevo secreto de depuración. Asegúrate de registrar el secreto de depuración nuevo.

Registra el secreto de depuración

  1. En la consola de Firevbase, ve a la sección Verificación de aplicaciones.
  2. En la pestaña Apps, haz clic en tu app para expandir sus detalles.
  3. En el menú ampliado, selecciona Administrar tokens de depuración: d77c8ff768a00b4b.png.
  4. Agrega el secreto que copiaste de la consola de Xcode y, luego, haz clic en Guardar f845c97b86f694d0.png.

Después de estos pasos, podrás usar la app en el simulador, incluso con la Verificación de aplicaciones aplicada.

Nota: El proveedor de depuración se diseñó específicamente para ayudar a prevenir las filtraciones de secretos de depuración. Con el enfoque actual, no necesitas almacenar el secreto de depuración en tu código fuente.

Puedes encontrar más detalles sobre este flujo en la documentación. Consulta Usa la Verificación de aplicaciones mediante el proveedor de depuración en iOS.

9. Habilita la aplicación forzosa de la Verificación de aplicaciones para Firebase Realtime Database

Por ahora, nuestra app declara un AppCheckProviderFactory que muestra un AppAttestProvider para dispositivos reales. Cuando se ejecute en un dispositivo físico, la app realizará la certificación y enviará los resultados al backend de Firebase. Sin embargo, el backend de Firebase aún acepta solicitudes de cualquier dispositivo, el simulador de iOS, una secuencia de comandos, etc. Este modo es útil cuando tienes usuarios con una versión anterior de la app sin la Verificación de aplicaciones y aún no quieres aplicar de manera forzosa las verificaciones de acceso.

Ahora, debes habilitar la aplicación forzosa de la Verificación de aplicaciones para asegurarte de que solo se pueda acceder a la app de Firebase desde dispositivos legítimos. Las versiones anteriores de la app sin integración de la Verificación de aplicaciones dejarán de funcionar cuando habilites la aplicación forzosa en el proyecto de Firebase.

  1. En Firebase console, en la sección Verificación de aplicaciones, haga clic en Realtime Database para expandir sus detalles.
  2. Haz clic en Aplicar.

64e6a81fa979b635.png

  1. Lee la información en el diálogo de confirmación y, luego, haz clic en Aplicar.

Después de completar estos pasos, solo las apps legítimas podrán acceder a la base de datos. Se bloquearán todas las demás apps.

Intenta acceder a Realtime Database con una app ilegítima

Para ver la aplicación forzosa de la Verificación de aplicaciones en acción, siga estos pasos:

  1. Para desactivar el registro de la Verificación de aplicaciones, marca como comentario el código de registro de la Verificación de aplicaciones en el método init del punto de entrada de la app en DatabaseExampleApp.
  2. Restablece el simulador seleccionando Dispositivo > Borrar todo el contenido y la configuración. Esta acción limpiará el simulador (y se invalidará el token de dispositivo).
  3. Vuelve a ejecutar la app en el simulador.
  4. Ahora, deberías ver el siguiente mensaje de error:
    [FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server.  Will not attempt reconnect. Reason: Invalid appcheck token.
    

Para volver a habilitar la Verificación de aplicaciones, haz lo siguiente:

  1. Quita los comentarios del código de registro de la Verificación de aplicaciones en DatabaseExampleApp.
  2. Reinicia la app.
  3. Toma nota del nuevo token de la Verificación de aplicaciones en la consola de Xcode.
  4. Registra el token de depuración en la configuración de la Verificación de aplicaciones de tu app en Firebase console.
  5. Vuelve a ejecutar la app.
  6. Ya no deberías ver un mensaje de error y deberías poder agregar publicaciones y comentarios nuevos en la app.

10. ¡Felicitaciones!

9785d32f18b995d2.gif

Ahora ya sabes cómo hacer lo siguiente:

  • Agrega la Verificación de aplicaciones a un proyecto existente
  • Configura un proveedor de certificación de App Attest para la versión de producción de tu app
  • Cómo configurar un proveedor de certificación de depuración para probar tu app en un simulador
  • Observa el lanzamiento de la versión de la app para saber cuándo aplicar la Verificación de aplicaciones en tu proyecto de Firebase
  • Habilita la aplicación forzosa de la Verificación de aplicaciones

Próximos pasos

Aprende a usar Remote Config para lanzar gradualmente la Verificación de aplicaciones para los usuarios en el codelab de lanzamiento gradual de la Verificación de aplicaciones de Firebase con Firebase Remote Config

Estos son otros recursos que podrían resultarte útiles

La configuración descrita en este codelab funcionará en la mayoría de los casos, pero la Verificación de aplicaciones te brinda más flexibilidad si es necesario. Consulta los siguientes vínculos para obtener más detalles: