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

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

Обеспечить правоприменение

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

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

    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. Включите параметр принудительного выполнения проверки приложений (App Check) для вашей функции:

    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 второго поколения с конфигурацией 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();