הפעלת אכיפה של בדיקת אפליקציות ב-Cloud Functions

אחרי שתבינו איך App Check ישפיע על המשתמשים ותהיו מוכנים להמשיך, תוכלו להפעיל את האכיפה של App Check עבור פונקציות שאפשר להפעיל.

הפעלת האכיפה

כדי להתחיל לאכוף את App Checkדרישות האסימון בפונקציות שאפשר להפעיל, צריך לשנות את הפונקציות כך שיבדקו אם יש App Checkאסימונים תקינים, כמו שמוצג בהמשך. אחרי שמפעילים את האכיפה, כל הבקשות שלא אומתו יידחו.

  1. מתקינים את Cloud Functions SDK.

    ‫Node.js (דור שני)

    מעדכנים את התלות 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"

    Python (תצוגה מקדימה)

    הוספת firebase-functions אל functions/requirements.txt:

    firebase-functions >= 0.1.0
    

    לאחר מכן, מעדכנים את התלויות בסביבה הווירטואלית של הפרויקט:

    ./venv/bin/pip install -r requirements.txt
    
  2. מפעילים את האפשרות App Check enforcement runtime (זמן ריצה של אכיפת App Check) לפונקציה:

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

    ‫Node.js (דור ראשון)

    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, צריך להעניק את התפקיד לחשבון השירות שמשמש כברירת המחדל של Compute.
  2. מגדירים את consumeAppCheckToken ל-true בהגדרת הפונקציה:

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

    ‫Node.js (דור ראשון)

    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. צריך לעדכן את קוד הלקוח של האפליקציה כדי לקבל אסימונים מוגבלים לשימוש חד-פעמי כשמפעילים את הפונקציה:

    Swift

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