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

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

Включить принудительное исполнение

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

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

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

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

    npm install firebase-functions@">=4.0.0"

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

    Обновите зависимость 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 (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.
        ...
      }
    );
    

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

    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. В консоли Google Cloud предоставьте роль «Firebase App Check Token Verifier» учетной записи службы, используемой функцией.

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

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

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

    Быстрый

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