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

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

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

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

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

    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"
    

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

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

    firebase-functions >= 0.1.0
    

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

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

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

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

    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 App Check Token Verifier учетной записи службы, используемой облачной функцией.

    • Если вы явно инициализируете Admin SDK и указали учетные данные служебной учетной записи Admin SDK вашего проекта, необходимая роль уже предоставлена.
    • Если вы используете Cloud Functions 1-го поколения с конфигурацией Admin SDK по умолчанию, назначьте роль учетной записи службы App Engine по умолчанию . См. раздел Изменение разрешений учетной записи службы .
    • Если вы используете облачные функции 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 {
        // ...
    }
    

    Модульный веб-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();