เปิดใช้การบังคับใช้ App Check สำหรับ Cloud Functions

เมื่อคุณเข้าใจว่า App Check จะส่งผลต่อผู้ใช้อย่างไร และเมื่อพร้อมดำเนินการต่อแล้ว คุณก็เปิดใช้การบังคับใช้ App Check

เปิดการบังคับใช้

วิธีเริ่มบังคับใช้ข้อกำหนดของโทเค็น App Check ใน Callable Cloud Functions แก้ไขฟังก์ชันเพื่อตรวจสอบ App Check ที่ถูกต้อง ตามที่แสดงด้านล่าง เมื่อเปิดใช้การบังคับใช้แล้ว คำขอที่ยังไม่ยืนยันทั้งหมด จะถูกปฏิเสธ

  1. ติดตั้ง Cloud Functions SDK

    Node.js (รุ่นที่ 1)

    อัปเดตทรัพยากร Dependency firebase-functions ของโปรเจ็กต์เป็นเวอร์ชัน 4.0.0 หรือ ใหม่กว่า:

    npm install firebase-functions@">=4.0.0"
    

    Node.js (รุ่นที่ 2)

    อัปเดตทรัพยากร Dependency firebase-functions ของโปรเจ็กต์เป็นเวอร์ชัน 4.0.0 หรือ ใหม่กว่า:

    npm install firebase-functions@">=4.0.0"
    

    Python (ตัวอย่าง)

    เพิ่ม firebase-functions ไปยัง functions/requirements.txt:

    firebase-functions >= 0.1.0
    

    จากนั้นอัปเดตทรัพยากร Dependency ในสภาพแวดล้อมเสมือนจริงของโปรเจ็กต์ดังนี้

    ./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
    

เมื่อทำให้การเปลี่ยนแปลงเหล่านี้ใช้งานได้แล้ว ฟังก์ชันระบบคลาวด์ที่เรียกใช้ได้ของคุณจะต้องใช้ โทเค็น App Check ที่ถูกต้อง SDK ไคลเอ็นต์ Cloud Functions โดยอัตโนมัติ แนบโทเค็น App Check เมื่อเรียกใช้ฟังก์ชันที่เรียกใช้ได้

การป้องกันการเล่นซ้ำ (เบต้า)

หากต้องการปกป้องฟังก์ชันที่เรียกใช้ได้จากการโจมตีแบบเล่นซ้ำ คุณสามารถใช้งาน ตรวจสอบโทเค็นหลังจากยืนยันแล้ว เมื่อใช้โทเค็นแล้ว จะไม่สามารถใช้ได้ อีกครั้ง

โปรดทราบว่าการใช้การป้องกันการเล่นซ้ำจะเพิ่มการส่งข้อมูลแบบไป-กลับของเครือข่ายไปยังโทเค็น ซึ่งจะเพิ่มเวลาในการตอบสนองให้กับการเรียกใช้ฟังก์ชันระบบคลาวด์ สำหรับกรณีนี้ แอปส่วนใหญ่มักจะเปิดใช้การป้องกันการเล่นซ้ำเฉพาะใน ปลายทางที่ละเอียดอ่อน

วิธีใช้โทเค็น

  1. ใน Cloud Console ได้ ให้สิทธิ์ "Firebase App Check Token Verifier" ของบัญชีบริการ ที่ Cloud Function ใช้งาน

    • หากคุณเริ่มต้น Admin SDK อย่างชัดเจนและได้ระบุ ข้อมูลเข้าสู่ระบบบัญชีบริการ Admin SDK ของโปรเจ็กต์ บทบาทที่จำเป็นคือ อนุญาตแล้ว
    • หากคุณใช้ Cloud Functions รุ่นที่ 1 กับผู้ดูแลระบบเริ่มต้น การกำหนดค่า SDK ให้บทบาทกับบริการ App Engine เริ่มต้น บัญชี ดูการเปลี่ยนสิทธิ์ของบัญชีบริการ
    • หากคุณใช้ Cloud Functions รุ่นที่ 2 กับผู้ดูแลระบบเริ่มต้น กำหนดค่า SDK มอบบทบาทให้กับบริการประมวลผลเริ่มต้น บัญชี
  2. ตั้งค่า consumeAppCheckToken เป็น true ในคําจํากัดความของฟังก์ชัน

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