Включение принудительной проверки приложений для облачных функций

Когда вы поймете, как App Check повлияет на ваших пользователей , и будете готовы продолжить, вы можете включить принудительное применение App Check для вызываемых функций .

Обеспечение соблюдения

Чтобы начать применять требования токенов App Check в вызываемых функциях, измените свои функции для проверки действительных токенов App Check , как показано ниже. После включения применения все непроверенные запросы будут отклоняться.

  1. Установите SDK Cloud Functions .

    Node.js (1-го поколения)

    Обновите зависимость firebase-functions вашего проекта до версии 4.0.0 или более поздней:

    npm install firebase-functions@">=4.0.0"

    Node.js (2-го поколения)

    Обновите зависимость firebase-functions вашего проекта до версии 4.0.0 или более поздней:

    npm install firebase-functions@">=4.0.0"

    Python (предварительный просмотр)

    Добавьте firebase-functions в functions/requirements.txt :

    firebase-functions >= 0.1.0
    

    Затем обновите зависимости в виртуальной среде вашего проекта:

    ./venv/bin/pip install -r requirements.txt
    
  2. Включите опцию выполнения принудительной проверки приложений для вашей функции:

    Node.js (1-го поколения)

    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-го поколения)

    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 (предварительный просмотр)

    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. Повторно распределите свои функции:

    firebase deploy --only functions
    

После развертывания этих изменений ваши вызываемые функции будут требовать действительные токены App Check . Клиентские SDK Cloud Functions автоматически прикрепляют токен App Check при вызове вызываемой функции.

Защита от повторного воспроизведения (бета)

Чтобы защитить вызываемую функцию от атак повторного воспроизведения, вы можете использовать токен App Check после его проверки. После того, как токен будет использован, его нельзя будет использовать снова.

Обратите внимание, что использование защиты от повторного воспроизведения добавляет сетевой цикл проверки токена и, следовательно, увеличивает задержку вызова функции. По этой причине большинство приложений обычно включают защиту от повторного воспроизведения только на особо чувствительных конечных точках.

Чтобы использовать токены:

  1. В консоли Cloud предоставьте роль «Firebase App Check Token Verifier» учетной записи службы, используемой функцией.

    • Если вы явно инициализируете Admin SDK и указали учетные данные учетной записи службы Admin SDK вашего проекта, требуемая роль уже предоставлена.
    • Если вы используете Cloud Functions 1-го поколения с конфигурацией Admin SDK по умолчанию, предоставьте роль учетной записи службы App Engine по умолчанию . См. Изменение разрешений учетной записи службы .
    • Если вы используете Cloud Functions 2-го поколения с конфигурацией Admin SDK по умолчанию, предоставьте роль учетной записи службы вычислений по умолчанию .
  2. Установите для consumeAppCheckToken значение true в определении функции:

    Node.js (1-го поколения)

    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-го поколения)

    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. Обновите клиентский код приложения, чтобы получать потребляемые токены ограниченного использования при вызове функции:

    Быстрый

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

    Web

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

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