Firebase App Check para plataformas Apple

1. Introducción

Firebase App Check ayuda a proteger sus recursos de back-end del abuso, como el fraude de facturación y el 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 atestación . Uno de esos proveedores es el servicio App Attest de Apple, que App Check puede usar para verificar la autenticidad de las aplicaciones y dispositivos de Apple.

lo que vas a construir

En este laboratorio de código, 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 atestació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 compatible con App Attest (más información sobre la disponibilidad de la API de 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 laboratorio de programación.

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

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 incrustado , 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 Archivo 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 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úrese de importar FirebaseAppCheck y configure una instancia de la clase MyAppCheckProviderFactory como la 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 la consola de Firebase:

  • Configura un proyecto de Firebase.
  • Agregue su 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 verificación de aplicaciones.

crear un proyecto

Primero, debe crear un proyecto de Firebase.

  1. En Firebase console , seleccione Agregar proyecto .
  2. Asigne un nombre a su 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 a la sección Base de datos en tiempo real de la consola Firebase.

  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 Modo bloqueado esté seleccionado y haga clic en el botón Habilitar para habilitar las Reglas de seguridad para su base de datos.
  4. Vaya a la pestaña Reglas del navegador de Realtime Database y reemplace las reglas predeterminadas con las siguientes:
    {
        "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 dice "Firmar para DatabaseExample (iOS) requiere un equipo de desarrollo" .
  4. Actualice el identificador del paquete a un identificador único. La forma más fácil de lograr esto es usar el nombre de dominio inverso de su sitio web, por ejemplo, com.acme.samples.firebase.quickstart.DatabaseExample (no use esta ID; elija su propia ID única).
  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 icono de información junto a 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 de 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 la consola de Firebase:

  1. Desde la pantalla de 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 . Elimine este archivo primero; 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 necesita realizar ningún cambio en el código.

Configurar la autenticación de Firebase

¡Uf! Eso es un poco de configuración hasta ahora, ¡pero agárrate fuerte! Si es nuevo en Firebase, ha visto partes esenciales de un flujo de trabajo con las que pronto se familiarizará.

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

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

  1. Todavía en Firebase console , abra 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 marque/desmarque publicaciones.

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

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

  1. En Firebase console, vaya a la sección Verificación de aplicaciones de la consola.
  2. Haz 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 de equipo de su cuenta de desarrollador de Apple (puede encontrarlo en la sección Membresía en el portal de desarrollador de Apple): 1645f7a369b678c2.png
  5. Haga clic en Guardar .

Con esto, tiene un proyecto de Firebase en funcionamiento que está conectado a nuestra nueva aplicación y App Check está habilitado.

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

7. Configure App Attest para su aplicación

Ahora es el momento de tener en tus manos el SDK de Firebase App Check e implementar un código de cliente.

En primer lugar, debe configurar el proyecto Xcode para que el SDK pueda usar la API App Attest de Apple para asegurarse de 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 objetivo 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 función Atest de aplicación ae84cd988a5fab31.png
  5. Aparecerá un archivo DatabaseExample (iOS).entitlements 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 termine estos pasos e inicie la aplicación en un dispositivo iOS físico (iPhone/iPad), la aplicación aún podrá acceder a Realtime Database. En un paso posterior, hará cumplir App Check, 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, consulte Habilitar verificación de aplicaciones con App Attest en iOS .

8. Configurar un proveedor de atestación de depuración para el simulador de iOS

El proveedor de depuración de Firebase App Check permite probar aplicaciones con la 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, debe configurar el proveedor de depuración juntos.

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 la consola de Firebase para 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 usar otros proveedores de atestación como DeviceCheck o un proveedor de atestación personalizado en las 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 de forma temporal o condicional 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 la consola de Firebase

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

  1. Si eligió 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. Encuentre 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 su simulador en el primer lanzamiento de la aplicación y se almacena en los valores predeterminados del usuario. Si elimina la aplicación, reinicia el simulador o usa otro simulador, se generará un nuevo secreto de depuración. Asegúrese de registrar el nuevo secreto de depuración.

Registrar el secreto de depuración

  1. De vuelta en la consola de Firevbase, vaya a la sección Comprobación de la aplicación .
  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ó desde la consola de 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 aplicado.

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

Se pueden encontrar más detalles sobre este flujo en la documentación; consulte Uso de 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 una AppCheckProviderFactory que devuelve un AppAttestProvider para dispositivos reales. Cuando se ejecuta en un dispositivo físico, su aplicación realizará la atestació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 tiene usuarios con una versión anterior de su aplicación sin App Check y no desea forzar el acceso. cheques todavía.

Ahora, debe habilitar el cumplimiento de App Check para asegurarse de que solo se pueda acceder a la aplicación Firebase desde dispositivos legítimos. Las versiones antiguas de la aplicación sin la integración de App Check dejarán de funcionar una vez que habilite la aplicación para el proyecto de 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, solo las aplicaciones legítimas podrán acceder a la base de datos. Todas las demás aplicaciones serán bloqueadas.

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

Para ver la ejecució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. Restablezca el simulador seleccionando Dispositivo > Borrar todo el contenido y la configuración . Esto borrará el Simulador (e invalidará el token del dispositivo).
  3. Vuelva a ejecutar la aplicación 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. Descomente el 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 Verificación de aplicaciones 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 ya sabes cómo:

  • Añadir App Check a un proyecto existente
  • Configure un proveedor de atestación de App Attest para la versión de producción de su aplicación
  • Configure un proveedor de atestació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 la Verificación de la aplicación para su proyecto de Firebase
  • Habilitar la aplicación de verificación de aplicaciones

Próximos pasos

Obtenga información sobre cómo usar Remote Config para implementar gradualmente App Check para sus usuarios en el laboratorio de código Implemente gradualmente Firebase App Check usando Firebase Remote Config.

Estos son otros recursos que pueden resultarle útiles.

La configuración descrita en este laboratorio de código 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: