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

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

הפעלת האכיפה

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

  1. מתקינים את ה-SDK של Cloud Functions.

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

    מעדכנים את התלות של firebase-functions בפרויקט לגרסה 4.0.0 או newer:

    npm install firebase-functions@">=4.0.0"

    Node.js (דור שני)

    מעדכנים את התלות של firebase-functions בפרויקט לגרסה 4.0.0 או newer:

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

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

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

    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 תקינים. ערכות ה-SDK של לקוחות Cloud Functions מצרפות באופן אוטומטי אסימון App Check כשאתם מפעילים פונקציה שניתן לקריאה.

הגנה מפני הפעלה חוזרת (בטא)

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

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

כדי לצרוך אסימונים:

  1. במסוף Cloud, מקצים את התפקיד 'Firebase App Check Token Verifier' לחשבון השירות שבו משתמשת הפונקציה ב-Cloud Functions.

    • אם אתם מפעילים את Admin SDK באופן מפורש וציינתם את פרטי הכניסה של חשבון השירות של Admin SDK בפרויקט, התפקיד הנדרש כבר הוקצה.
    • אם אתם משתמשים ב-Cloud Functions מדור ראשון עם הגדרת ברירת המחדל של Admin SDK, צריך להקצות את התפקיד לחשבון השירות שמוגדר כברירת מחדל ב-App Engine. ראו שינוי הרשאות של חשבון שירות.
    • אם אתם משתמשים ב-Cloud Functions מדור שני עם הגדרת ברירת המחדל של Admin SDK, מקצים את התפקיד לחשבון ברירת המחדל של שירות המחשוב.
  2. מגדירים את consumeAppCheckToken לערך true בהגדרת הפונקציה:

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

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

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