Activer l'application App Check pour Cloud Functions

Lorsque vous comprenez l'impact de App Check sur vos utilisateurs et que vous êtes prêt à continuer, vous pouvez activer l'application de App Check pour les fonctions appelables.

Activer l'application des règles

Pour commencer à appliquer les exigences concernant les jetons App Check dans vos fonctions appelables, modifiez vos fonctions afin de vérifier si les jetons App Check sont valides, comme indiqué ci-dessous. Une fois que vous avez activé l'application des règles, toutes les requêtes non validées seront refusées.

  1. Installez le Cloud Functions SDK.

    Node.js (2e génération)

    Mettez à jour la dépendance firebase-functions de votre projet vers la version 4.0.0 ou une version ultérieure :

    npm install firebase-functions@">=4.0.0"

    Node.js (1re génération)

    Mettez à jour la dépendance firebase-functions de votre projet vers la version 4.0.0 ou une version ultérieure :

    npm install firebase-functions@">=4.0.0"

    Python (bêta)

    Ajoutez firebase-functions à functions/requirements.txt :

    firebase-functions >= 0.1.0
    

    Mettez ensuite à jour les dépendances dans l'environnement virtuel de votre projet :

    ./venv/bin/pip install -r requirements.txt
    
  2. Activez l'option d'exécution de l'application App Check pour votre fonction :

    Node.js (2e génération)

    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.
        ...
      }
    );
    

    Node.js (1re génération)

    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.
            ...
      });
    

    Python (bêta)

    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. Redéployez vos fonctions :

    firebase deploy --only functions
    

Une fois ces modifications déployées, vos fonctions appelables nécessiteront des App Check jetons valides. Les SDK client Cloud Functions associent automatiquement un jeton App Check lorsque vous appelez une fonction appelable.

Protection contre le rejeu (bêta)

Pour protéger une fonction appelable contre les attaques par rejeu, vous pouvez consommer le jeton App Check après l'avoir validé. Une fois le jeton consommé, il ne peut plus être utilisé.

Notez que l'utilisation de la protection contre le rejeu ajoute un aller-retour réseau à la validation du jeton, et donc une latence à l'appel de fonction. Pour cette raison, la plupart des applications n'activent généralement la protection contre le rejeu que sur les points de terminaison particulièrement sensibles.

Pour consommer des jetons :

  1. Dans la Google Cloud console, attribuez le rôle "Validateur de jeton Firebase App Check" au compte de service utilisé par la fonction.

    • Si vous initialisez explicitement le SDK Admin et que vous avez spécifié les identifiants du compte de service du SDK Admin de votre projet, le rôle requis est déjà attribué.
    • Si vous utilisez Cloud Functions de 1re génération avec la configuration par défaut du SDK Admin, attribuez le rôle au compte de service App Engine par défaut. Consultez la section Modifier les autorisations du compte de service.
    • Si vous utilisez Cloud Functions de 2e génération avec la configuration par défaut du SDK Admin, attribuez le rôle au compte de service Compute par défaut.
  2. Définissez consumeAppCheckToken sur true dans la définition de votre fonction :

    Node.js (2e génération)

    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.
        ...
      }
    );
    

    Node.js (1re génération)

    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.
          ...
      });
    
  3. Mettez à jour le code client de votre application pour acquérir des jetons à usage limité consommables lorsque vous appelez la fonction :

    Swift

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

    Kotlin

    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();
    

    Web

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