เปิดใช้การบังคับใช้ 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 โดยอัตโนมัติเมื่อคุณเรียกใช้ฟังก์ชันที่เรียกใช้ได้

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

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

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

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

  1. ในคอนโซล Cloud ให้มอบหมายบทบาท "ผู้ตรวจสอบโทเค็น App Check ของ Firebase" ให้กับบัญชีบริการที่ 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();