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

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

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

หากต้องการเริ่มบังคับใช้ข้อกําหนดเกี่ยวกับโทเค็น App Check ในฟังก์ชันที่เรียกใช้ได้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
    

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

    ./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 ที่ถูกต้อง SDK ของไคลเอ็นต์ Cloud Functions โดยอัตโนมัติ แนบโทเค็น App Check เมื่อคุณเรียกใช้ฟังก์ชันที่เรียกใช้ได้

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

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

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

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

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

    • หากคุณเริ่มต้น Admin SDK อย่างชัดเจนและได้ระบุ ข้อมูลเข้าสู่ระบบบัญชีบริการ Admin SDK ของโปรเจ็กต์ บทบาทที่จำเป็นคือ อนุญาตแล้ว
    • หากคุณใช้ Cloud Functions รุ่นที่ 1 ที่มีการกำหนดค่า Admin SDK เริ่มต้น ให้มอบหมายบทบาทให้กับบัญชีบริการเริ่มต้นของ App Engine โปรดดูหัวข้อการเปลี่ยนสิทธิ์ของบัญชีบริการ
    • หากคุณใช้ Cloud Functions รุ่นที่ 2 ที่มีการกำหนดค่า Admin 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();