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

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

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

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

  1. Установите SDK облачных функций.

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

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

    npm install firebase-functions@">=4.0.0"
    

    Node.js (второе поколение)

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

    npm install firebase-functions@">=4.0.0"
    

    Питон (предварительная версия)

    Добавьте 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 (второе поколение)

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

    Питон (предварительная версия)

    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
    

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

Защита от повтора (бета)

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

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

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

  1. В облачной консоли предоставьте роль «Проверщик токена проверки приложения Firebase» учетной записи службы, используемой облачной функцией.

    • Если вы явно инициализируете 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 (второе поколение)

    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 {
        // ...
    }
    

    Веб-модульный API

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