Cloud Functions の関数で App Check の適用を有効にする

App Check がユーザーに与える影響を理解し、続行する準備ができたら、App Check の適用を有効にできます。

適用を有効にする

呼び出し可能な Cloud FunctionsApp Check トークンの必要条件の適用を開始するには、以下に示すように、有効な App Check トークンを確認するように関数を変更します。適用を有効にすると、未検証のリクエストはすべて拒否されます。

  1. Cloud Functions 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"
    

    Python(プレビュー)

    functions/requirements.txtfirebase-functions を追加します。

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

    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
    

これらの変更がデプロイされると、呼び出し可能な Cloud Functions で有効な App Check トークンが必須になります。呼び出し可能関数を呼び出すとき、Cloud Functions クライアント SDK が App Check トークンを自動的に追加します。

リプレイ保護(ベータ版)

呼び出し可能関数をリプレイ攻撃から保護するために、App Check トークンを検証後に使用済みにすることができます。使用済みにされたトークンは、再度使用できません。

リプレイ保護を使用すると、トークン検証においてネットワークのラウンド トリップが一つ追加されるため、Cloud Functions の関数呼び出しでレイテンシが増加することに注意してください。このため、ほとんどのアプリでは通常、特に機密性の高いエンドポイントでのみリプレイ保護を有効にします。

トークンを使用済みにするには:

  1. Cloud コンソールで、Cloud Functions で使用されるサービス アカウントに「Firebase App Check Token Verifier」ロールを付与します。

    • Admin SDK を明示的に初期化し、その際にプロジェクトの Admin SDK サービス アカウントの認証情報を指定した場合、必要なロールはすでに付与されています。
    • デフォルトの Admin SDK 構成で第 1 世代の Cloud Functions を使用している場合は、App Engine のデフォルト サービス アカウントにロールを付与します。詳しくは、サービス アカウントの権限を変更するをご覧ください。
    • デフォルトの Admin SDK 構成で第 2 世代の Cloud Functions を使用している場合は、デフォルトのコンピューティング サービス アカウントにロールを付与します。
  2. 関数定義で consumeAppCheckTokentrue に設定します。

    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. 次の関数を呼び出すときに使用済みにできる限定使用のトークンを取得するよう、アプリのクライアント コードを更新します。

    Swift

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