Comprobación de aplicaciones Firebase para plataformas Apple

1. Introducción

Firebase App Check ayuda a proteger sus recursos backend contra abusos, como fraude de facturación y phishing, al asegurarse de que las solicitudes provengan de aplicaciones y dispositivos legítimos. Funciona tanto con los servicios de Firebase como con sus propios servicios de backend para mantener sus recursos seguros.

Puede obtener más información sobre Firebase App Check en la documentación de Firebase.

App Check utiliza servicios específicos de la plataforma para verificar la integridad de una aplicación y/o dispositivo. Estos servicios se denominan proveedores de certificación . Uno de esos proveedores es el servicio App Attest de Apple, que App Check puede utilizar para verificar la autenticidad de las aplicaciones y dispositivos de Apple.

lo que construirás

En este codelab, agregará y aplicará App Check en una aplicación de muestra existente para que la base de datos en tiempo real del proyecto esté protegida contra el acceso de aplicaciones y dispositivos ilegítimos.

lo que aprenderás

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

Lo que necesitarás

  • Xcode 13.3.1 o posterior
  • Una cuenta de desarrollador de Apple que le permite crear nuevos identificadores de aplicaciones
  • Un dispositivo iOS/iPadOS que admita App Attest (obtenga más información sobre la disponibilidad de la API App Attest )

2. Obtenga el proyecto inicial

El repositorio de Firebase Quickstarts para iOS contiene aplicaciones de muestra para demostrar diferentes productos de Firebase. Utilizará la aplicación Firebase Database Quickstart para SwiftUI como base para este codelab.

Clona el repositorio de Firebase Quickstarts para iOS desde la línea de comando:

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

Abra el proyecto de la aplicación Realtime Database SwiftUI Quickstart en Xcode:

cd database/DatabaseExampleSwiftUI/DatabaseExample
xed .

3. Agregue App Check a su aplicación

  1. Espere a que Swift Package Manager resuelva las dependencias del proyecto.
  2. Abra la pestaña General del destino de la aplicación DatabaseExample (iOS) . Luego, en la sección Marcos, bibliotecas y contenido integrado , haga clic en el botón + .
  3. Seleccione para agregar FirebaseAppCheck .

4. Cree e instale la fábrica de proveedores de App Check.

  1. En el grupo de archivos Shared , agregue un nuevo grupo llamado AppCheck .
  2. Dentro de este grupo, cree una clase de fábrica en un archivo separado, por ejemplo, MyAppCheckProviderFactory.swift , asegurándose de agregarla 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úrese de importar FirebaseAppCheck y configurar una instancia de la clase MyAppCheckProviderFactory como fábrica de proveedores de App Check.
    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 App Check en su proyecto de iOS, debe seguir estos pasos en Firebase console:

  • Configura un proyecto de Firebase.
  • Agrega tu aplicación de iOS al proyecto de Firebase.
  • Configure la autenticación de Firebase.
  • Inicialice la instancia de Realtime Database que va a proteger.
  • Configurar la verificación de aplicaciones.

Crear un proyecto

Primero, necesitas crear un proyecto de Firebase.

  1. En Firebase console , selecciona Agregar proyecto .
  2. Nombra tu proyecto App Check Codelab
  3. Haga clic en Continuar.
  4. Deshabilite Google Analytics para este proyecto y luego haga clic en Crear proyecto.

Crear una instancia de base de datos en tiempo real

Ahora, navegue hasta la sección Base de datos en tiempo real de Firebase console.

  1. Haga clic en el botón Crear base de datos para iniciar el flujo de trabajo de creación de la base de datos.
  2. Deje la ubicación predeterminada ( us-central1 ) para la base de datos sin cambios y haga clic en Siguiente .
  3. Asegúrese de que el Modo bloqueado esté seleccionado y haga clic en el botón Habilitar para habilitar las reglas de seguridad para su base de datos.
  4. Navegue a la pestaña Reglas del navegador Realtime Database y reemplace las reglas predeterminadas con 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. Haga clic en el botón Publicar para activar las Reglas de seguridad actualizadas.

Prepare su aplicación iOS para conectarse a Firebase

Para poder ejecutar la aplicación de muestra en un dispositivo físico, debe agregar el proyecto a su equipo de desarrollo para que Xcode pueda administrar el perfil de aprovisionamiento requerido por usted. Siga estos pasos para agregar la aplicación de muestra a su cuenta de desarrollador:

  1. En Xcode, seleccione el proyecto DatabaseExample en el navegador de proyectos.
  2. Seleccione el destino DatabaseExample (iOS) y abra la pestaña Firma y capacidades .
  3. Debería ver un mensaje de error que diga "La firma de DatabaseExample (iOS) requiere un equipo de desarrollo" .
  4. Actualice el identificador del paquete a un identificador único. La forma más sencilla de lograrlo es utilizar el nombre de dominio inverso de su sitio web, por ejemplo, com.acme.samples.firebase.quickstart.DatabaseExample (no utilice este ID; elija su propio ID único).
  5. Seleccione su equipo de desarrollo.
  6. Sabrá que todo salió bien cuando Xcode muestre "Perfil de aprovisionamiento: Perfil administrado de Xcode" y un pequeño ícono de información al lado de esta etiqueta. Al hacer clic en este icono se mostrarán más detalles sobre el perfil de aprovisionamiento.

Conecte su aplicación iOS

Para obtener una explicación detallada sobre cómo conectar su aplicación, consulte la documentación sobre cómo agregar Firebase a su proyecto de iOS . Para comenzar, siga estos pasos principales en Firebase console:

  1. Desde la pantalla Descripción general del proyecto de su nuevo proyecto, haga clic en el botón + Agregar aplicación y luego haga clic en el ícono de iOS+ para agregar una nueva aplicación de iOS a su proyecto de Firebase.
  2. Ingrese el ID del paquete de su aplicación (use el que definió en la sección anterior, como com.acme.samples.firebase.quickstart.DatabaseExample ; tenga en cuenta que debe ser un identificador único).
  3. Haga clic en Registrar aplicación .
  4. Firebase genera un archivo GoogleService-Info.plist que contiene todos los metadatos de Firebase necesarios para su aplicación.
  5. Haga clic en Descargar GoogleService-Info.plist para descargar el archivo.
  6. En Xcode, verá que el proyecto ya contiene un archivo llamado GoogleService-Info.plist . Primero elimine este archivo; lo reemplazará con el de su propio proyecto de Firebase en el siguiente paso.
  7. Copie el archivo GoogleService-Info.plist que descargó en el paso anterior en la carpeta raíz de su proyecto Xcode y agréguelo al destino DatabaseExample (iOS) , asegurándose de que se llame GoogleService-Info.plist
  8. Haga clic en los pasos restantes del flujo de registro. Dado que el proyecto de muestra ya está configurado correctamente, no es necesario realizar ningún cambio en el código.

Configurar la autenticación de Firebase

¡Uf! Eso es bastante configuración hasta ahora, ¡pero agárrate fuerte! Si eres nuevo en Firebase, habrás visto partes esenciales de un flujo de trabajo con el que pronto estarás familiarizado.

Ahora configurará la autenticación de Firebase para esta aplicación.

Habilitar autenticación Proveedor de inicio de sesión de correo electrónico/contraseña

  1. Aún en Firebase console , abre la sección Autenticación de la consola.
  2. Haga clic en Comenzar para configurar Firebase Authentication para su proyecto.
  3. Seleccione la pestaña Método de inicio de sesión .
  4. Seleccione Correo electrónico/Contraseña en la sección Proveedores nativos .
  5. Habilite Correo electrónico/Contraseña y haga clic en Guardar .

Agregar un usuario de prueba

  1. Abra la pestaña Usuarios de la sección Autenticación .
  2. Haga clic en Agregar usuario .
  3. Especifique un correo electrónico y una contraseña para su usuario de prueba, luego haga clic en Agregar usuario .

Prueba la aplicación

Vuelva a Xcode y ejecute la aplicación en el simulador de iOS. Inicie sesión con el correo electrónico y la contraseña del usuario de prueba que acaba de crear. Una vez que haya iniciado sesión, cree una publicación, publique un comentario en una publicación existente y destaque o deje de destacar publicaciones.

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

En este paso, configurará App Check para usar el proveedor App Attest en Firebase console.

  1. En Firebase console, navega hasta la sección App Check de la consola.
  2. Haga clic en Comenzar .
  3. En la pestaña Aplicaciones , haga clic en su aplicación para ampliar sus detalles.
  4. Haga clic en App Attest para configurar App Attest, luego ingrese el ID del equipo de su cuenta de desarrollador de Apple (puede encontrarlo en la sección Membresía en el portal de desarrolladores de Apple): 1645f7a369b678c2.png
  5. Clic en Guardar .

Con esto, tiene un proyecto de Firebase en funcionamiento que está conectado a nuestra nueva aplicación y la verificación de aplicaciones está habilitada.

¡Ya estás listo para configurar nuestro servicio de atestación específico! Para obtener más información sobre este flujo de trabajo, consulte Habilitar la verificación de aplicaciones con App Attest en iOS .

7. Configure App Attest para su aplicación

Ahora es el momento de tener en sus manos el SDK de Firebase App Check e implementar algún código de cliente.

Primero, debe configurar el proyecto Xcode para que el SDK pueda usar la API App Attest de Apple para garantizar que las solicitudes enviadas desde su aplicación provengan de instancias legítimas de su aplicación.

  1. Agregue la capacidad App Attest para el destino de su aplicación en el proyecto Xcode:
  2. abra la pestaña Firma y capacidades en la configuración de destino de su aplicación
  3. haga clic en el botón " + "
  4. en el cuadro de diálogo, busque y seleccione la capacidad de certificación de aplicaciones ae84cd988a5fab31.png
  5. Un archivo DatabaseExample (iOS).entitlements aparecerá en la carpeta raíz de su proyecto Xcode después de realizar el paso anterior.
  6. En el archivo DatabaseExample (iOS).entitlements , cambie el valor de la clave App Attest Environment a production.

Una vez que complete estos pasos e inicie la aplicación en un dispositivo iOS físico (iPhone/iPad), la aplicación aún podrá acceder a la base de datos en tiempo real. En un paso posterior, aplicará App Check, que bloqueará las solicitudes enviadas desde aplicaciones y dispositivos ilegítimos.

Para obtener más información sobre este flujo de trabajo, consulte Habilitar la verificación de aplicaciones con App Attest en iOS .

8. Configure un proveedor de certificación de depuración para el simulador de iOS

El proveedor Firebase App Check Debug permite probar aplicaciones con aplicación de Firebase App Check en entornos que no son de confianza, incluido el simulador de iOS, durante el proceso de desarrollo. A continuación, deben configurar juntos el proveedor de depuración.

Instale el proveedor de depuración de Firebase en su aplicación

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

Hiciste la mayor parte de esto cuando creaste la fábrica de proveedores de App Check. En este paso, agregará el registro del secreto de depuración local generado por el proveedor de depuración, de modo que pueda registrar esta instancia de la aplicación en Firebase console con fines de depuración.

Actualice 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 brinda más flexibilidad para configurar App Check según el entorno. Por ejemplo, puede utilizar otros proveedores de certificación como DeviceCheck o un proveedor de certificación personalizado en versiones del sistema operativo donde App Attest no está disponible. Vea un ejemplo a continuación:

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: instalar AppCheckDebugProviderFactory

Para casos más simples, puede instalar temporal o condicionalmente AppCheckDebugProviderFactory antes de configurar la instancia de la aplicación Firebase:

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

  AppCheck.setAppCheckProviderFactory(providerFactory)

  FirebaseApp.configure()
}

Esto le ahorrará un par de líneas de código al crear su propia fábrica de proveedores de App Check.

Registre su secreto de depuración en Firebase console

Obtenga el secreto de depuración de su simulador de iOS

  1. Si elige instalar AppCheckDebugProviderFactory (opción 2 anterior), debe habilitar el registro de depuración para su aplicación agregando -FIRDebugEnabled a los argumentos de inicio de la aplicación: f1c6b477a373e144.png
  2. Ejecute su aplicación en un simulador
  3. Busque el secreto de depuración en la consola 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 su simulador en el primer inicio de la aplicación y se almacena en los valores predeterminados del usuario. Si elimina la aplicación, reinicia el simulador o utiliza otro simulador, se generará un nuevo secreto de depuración. Asegúrese de registrar el nuevo secreto de depuración.

Registre el secreto de depuración

  1. De vuelta en la consola Firevbase, vaya a la sección Verificación de aplicaciones .
  2. En la pestaña Aplicaciones , haga clic en su aplicación para ampliar sus detalles.
  3. En el menú adicional, seleccione Administrar tokens de depuración : d77c8ff768a00b4b.png
  4. Agregue el secreto que copió de la consola Xcode y luego haga clic en Guardar f845c97b86f694d0.png

Después de estos pasos, puede usar la aplicación en el Simulador incluso con App Check aplicada.

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

Puede encontrar más detalles sobre este flujo en la documentación; consulte Usar App Check con el proveedor de depuración en iOS .

9. Habilite la aplicación de verificación de aplicaciones para Firebase Realtime Database

Por ahora, nuestra aplicación declara AppCheckProviderFactory que devuelve un AppAttestProvider para dispositivos reales. Cuando se ejecuta en un dispositivo físico, su aplicación 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, un script, etc. Este modo es útil cuando todavía tienes usuarios con una versión anterior de tu aplicación sin App Check y no deseas imponer el acceso. cheques todavía.

Ahora, debe habilitar la aplicación de App Check para garantizar que solo se pueda acceder a la aplicación Firebase desde dispositivos legítimos. Las versiones antiguas de la aplicación sin integración de App Check dejarán de funcionar una vez que habilites la aplicación para el proyecto Firebase.

  1. En Firebase console, en la sección App Check , haz clic en Realtime Database para expandir sus detalles.
  2. Haga clic en Aplicar .

64e6a81fa979b635.png

  1. Lea la información en el cuadro de diálogo de confirmación y luego haga clic en Aplicar .

Después de completar estos pasos, sólo las aplicaciones legítimas podrán acceder a la base de datos. Todas las demás aplicaciones se bloquearán.

Intente acceder a Realtime Database con una aplicación ilegítima

Para ver la aplicación de App Check en acción, siga estos pasos:

  1. Desactive el registro de App Check comentando el código de registro de App Check en el método init del punto de entrada de su aplicación en DatabaseExampleApp .
  2. Reinicie el simulador seleccionando Dispositivo > Borrar todo el contenido y la configuración . Esto borrará el simulador (e invalidará el token del dispositivo).
  3. Ejecute la aplicación nuevamente en el Simulador.
  4. Ahora debería 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 App Check, haga lo siguiente:

  1. Quite el comentario del código de registro de App Check en DatabaseExampleApp .
  2. Reinicie la aplicación.
  3. Tome nota del nuevo token App Check en la consola de Xcode.
  4. Registre el token de depuración en la configuración de App Check de su aplicación en Firebase console.
  5. Vuelva a ejecutar la aplicación.
  6. Ya no debería ver un mensaje de error y debería poder agregar nuevas publicaciones y comentarios en la aplicación.

10. ¡Felicitaciones!

9785d32f18b995d2.gif

Ahora sabes cómo:

  • Agregar App Check a un proyecto existente
  • Configure un proveedor de certificación App Attest para la versión de producción de su aplicación
  • Configure un proveedor de certificación de depuración para probar su aplicación en un simulador
  • Observe el lanzamiento de la versión de la aplicación para saber cuándo aplicar App Check para su proyecto de Firebase.
  • Habilitar la aplicación de verificación de aplicaciones

Próximos pasos

Aprenda a usar Remote Config para implementar gradualmente App Check para sus usuarios en el codelab Implementación gradual de Firebase App Check usando Firebase Remote Config.

Estos son otros recursos que pueden resultarle útiles.

La configuración descrita en este codelab funcionará en la mayoría de los casos, pero App Check le permite más flexibilidad si es necesario; consulte los siguientes enlaces para obtener más detalles: