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

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

הפעלת האכיפה

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

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

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

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

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

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

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

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

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