Habilita la aplicación forzosa de la Verificación de aplicaciones para Cloud Functions

Cuando comprendas cómo la Verificación de aplicaciones afectará a tus usuarios y estés listo para continuar, puedes habilitar la aplicación forzosa de la Verificación de aplicaciones.

Habilita la aplicación forzosa

A fin de comenzar a aplicar de manera forzosa los requisitos del token de la Verificación de aplicaciones en las funciones de Cloud Functions que admiten llamadas, modifica las funciones para comprobar los tokens válidos de la Verificación de aplicaciones, como se muestra a continuación. Una vez que habilites la aplicación forzosa, se rechazarán todas las solicitudes no verificadas.

  1. Instala el SDK de Cloud Functions.

    Node.js (1ª gen.)

    Actualiza la dependencia firebase-functions del proyecto a la versión 4.0.0 o una posterior:

    npm install firebase-functions@">=4.0.0"
    

    Node.js (2ª gen.)

    Actualiza la dependencia firebase-functions del proyecto a la versión 4.0.0 o una posterior:

    npm install firebase-functions@">=4.0.0"
    

    Python (versión preliminar)

    Agrega firebase-functions a functions/requirements.txt:

    firebase-functions >= 0.1.0
    

    Luego, actualiza las dependencias en el entorno virtual de tu proyecto:

    ./venv/bin/pip install -r requirements.txt
    
  2. Habilita la opción del entorno de ejecución de la aplicación forzosa de la Verificación de aplicaciones para la función:

    Node.js (1ª gen.)

    const functions = require("firebase-functions/v1");
    
    exports.yourV1CallableFunction = functions
      .runWith({
          enforceAppCheck: true, // Reject requests with missing or invalid App Check tokens.
      })
      .https.onCall((data, context) => {
            // context.app contains data from App Check, including the app ID.
            // Your function logic follows.
            ...
      });
    

    Node.js (2ª gen.)

    const { onCall } = require("firebase-functions/v2/https");
    
    exports.yourV2CallableFunction = onCall(
      {
        enforceAppCheck: true, // Reject requests with missing or invalid App Check tokens.
      },
      (request) => {
        // request.app contains data from App Check, including the app ID.
        // Your function logic follows.
        ...
      }
    );
    

    Python (versión preliminar)

    from firebase_functions import https_fn
    
    @https_fn.on_call(
        enforce_app_check=True  # Reject requests with missing or invalid App Check tokens.
    )
    def your_callable_function(req: https_fn.CallableRequest) -> https_fn.Response:
        # req.app contains data from App Check, including the app ID.
        # Your function logic follows.
        ...
    
  3. Vuelve a implementar las funciones:

    firebase deploy --only functions
    

Una vez que se implementen estos cambios, las funciones de Cloud Functions que admiten llamadas requerirán tokens válidos de la Verificación de aplicaciones. Los SDK de cliente de Cloud Functions adjuntan un token de la Verificación de aplicaciones de forma automática cuando se invoca una función que admite llamadas.

Protección contra la repetición (beta)

Para proteger una función que admite llamadas de los ataques de repetición, puedes consumir el token de la Verificación de aplicaciones después de verificarlo. Una vez que se consume, no se puede volver a usar.

Ten en cuenta que el uso de la protección contra la repetición agrega un proceso de ida y vuelta en la red a la verificación de tokens y, por lo tanto, agrega latencia a la llamada de Cloud Function. Por este motivo, la mayoría de las apps suelen habilitar la protección contra la reproducción solo en extremos particularmente sensibles.

Para consumir tokens, haz lo siguiente:

  1. En Cloud Console, otorga el rol “Verificador de tokens de Verificación de aplicaciones de Firebase” a la cuenta de servicio que usa la Cloud Function.

    • Si inicializas explícitamente el SDK de Admin y especificaste las credenciales de la cuenta de servicio del SDK de Admin de tu proyecto, el rol requerido ya está otorgado.
    • Si usas Cloud Functions de primera generación con la configuración predeterminada del SDK de Admin, otorga el rol a la cuenta de servicio predeterminada de App Engine. Consulta Cambia los permisos de la cuenta de servicio.
    • Si usas Cloud Functions de segunda generación con la configuración predeterminada del SDK de Admin, otorga el rol a la cuenta de servicio predeterminada de Compute.
  2. Establece consumeAppCheckToken como true en la definición de la función:

    Node.js (1ª gen.)

    const functions = require("firebase-functions/v1");
    
    exports.yourV1CallableFunction = functions
      .runWith({
          enforceAppCheck: true, // Reject requests with missing or invalid App Check tokens.
          consumeAppCheckToken: true  // Consume the token after verification.
      })
      .https.onCall((data, context) => {
          // context.app contains data from App Check, including the app ID.
          // Your function logic follows.
          ...
      });
    

    Node.js (2ª gen.)

    const { onCall } = require("firebase-functions/v2/https");
    
    exports.yourV2CallableFunction = onCall(
      {
        enforceAppCheck: true, // Reject requests with missing or invalid App Check tokens.
        consumeAppCheckToken: true  // Consume the token after verification.
      },
      (request) => {
        // request.app contains data from App Check, including the app ID.
        // Your function logic follows.
        ...
      }
    );
    
  3. Actualiza el código de cliente de tu app para adquirir tokens de uso limitado consumibles cuando llames a la función:

    Swift

    let options = HTTPSCallableOptions(requireLimitedUseAppCheckTokens: true)
    let yourCallableFunction =
        Functions.functions().httpsCallable("yourCallableFunction", options: options)
    do {
        let result = try await yourCallableFunction.call()
    } catch {
        // ...
    }
    

    API modular web

    import { getFunctions, httpsCallable } from "firebase/functions";
    
    const yourCallableFunction = httpsCallable(
      getFunctions(),
      "yourCallableFunction",
      { limitedUseAppCheckTokens: true },
    );
    await yourCallableFunction();
    

    Kotlin+KTX

    val yourCallableFunction = Firebase.functions.getHttpsCallable("yourCallableFunction") {
        limitedUseAppCheckTokens = true
    }
    val result = yourCallableFunction.call().await()
    

    Java

    HttpsCallableReference yourCallableFunction = FirebaseFunctions.getInstance().getHttpsCallable(
            "yourCallableFunction",
            new HttpsCallableOptions.Builder()
                    .setLimitedUseAppCheckTokens(true)
                    .build()
    );
    Task<HttpsCallableResult> result = yourCallableFunction.call();