Bật tính năng thực thi tính năng Kiểm tra ứng dụng cho Cloud Functions

Khi bạn hiểu rõ cách tính năng Kiểm tra ứng dụng sẽ ảnh hưởng đến người dùng của mình và sẵn sàng tiếp tục, bạn có thể bật tính năng thực thi tính năng Kiểm tra ứng dụng.

Cho phép thực thi

Để bắt đầu thực thi các yêu cầu về mã thông báo Kiểm tra ứng dụng trong thuộc tính có thể gọi Cloud Functions, hãy sửa đổi các hàm của bạn để kiểm tra xem có tính năng Kiểm tra ứng dụng hợp lệ không mã, như được hiển thị dưới đây. Sau khi bạn bật biện pháp thực thi, tất cả các yêu cầu chưa được xác minh sẽ bị từ chối.

  1. Cài đặt Cloud Functions SDK.

    Node.js (thế hệ thứ 1)

    Cập nhật phần phụ thuộc firebase-functions của dự án lên phiên bản 4.0.0 hoặc mới hơn:

    npm install firebase-functions@">=4.0.0"
    

    Node.js (thế hệ thứ 2)

    Cập nhật phần phụ thuộc firebase-functions của dự án lên phiên bản 4.0.0 hoặc mới hơn:

    npm install firebase-functions@">=4.0.0"
    

    Python (bản xem trước)

    Thêm firebase-functions vào functions/requirements.txt:

    firebase-functions >= 0.1.0
    

    Sau đó, hãy cập nhật các phần phụ thuộc trong môi trường ảo của dự án:

    ./venv/bin/pip install -r requirements.txt
    
  2. Bật tuỳ chọn thời gian chạy thực thi tính năng Kiểm tra ứng dụng cho hàm của bạn:

    Node.js (thế hệ thứ 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 (thế hệ thứ 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 (bản xem trước)

    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. Triển khai lại các chức năng:

    firebase deploy --only functions
    

Sau khi triển khai những thay đổi này, Cloud Functions có thể gọi của bạn sẽ cần mã thông báo Kiểm tra ứng dụng hợp lệ. Các SDK ứng dụng Cloud Functions tự động đính kèm mã thông báo Kiểm tra ứng dụng khi bạn gọi một hàm có thể gọi.

Chống phát lại (thử nghiệm)

Để bảo vệ một chức năng có thể gọi khỏi các cuộc tấn công phát lại, bạn có thể sử dụng Ứng dụng Hãy kiểm tra mã thông báo sau khi xác minh. Sau khi mã thông báo được tiêu thụ, bạn không thể sử dụng nó một lần nữa.

Lưu ý rằng việc sử dụng tính năng chống phát lại sẽ thêm lượt khứ hồi mạng vào mã thông báo và do đó làm tăng độ trễ cho lệnh gọi hàm đám mây. Để làm việc này lý do là hầu hết các ứng dụng thường chỉ bật tính năng bảo vệ chống phát lại trên điểm cuối nhạy cảm.

Cách sử dụng mã thông báo:

  1. Trong bảng điều khiển Cloud, cấp "Trình xác minh mã thông báo của tính năng Kiểm tra ứng dụng Firebase" vai trò đối với tài khoản dịch vụ mà Chức năng đám mây sử dụng.

    • Nếu bạn rõ ràng đang khởi chạy SDK dành cho quản trị viên và đã chỉ định thông tin đăng nhập tài khoản dịch vụ SDK quản trị của dự án, vai trò bắt buộc là đã được cấp.
    • Nếu bạn đang sử dụng Cloud Functions thế hệ thứ nhất với vai trò Quản trị viên mặc định Cấu hình SDK, cấp vai trò cho dịch vụ mặc định của App Engine tài khoản. Hãy xem phần Thay đổi quyền đối với tài khoản dịch vụ.
    • Nếu bạn đang sử dụng Cloud Functions thế hệ thứ 2 với quyền Quản trị viên mặc định Cấu hình SDK, cấp vai trò cho Dịch vụ điện toán mặc định tài khoản.
  2. Đặt consumeAppCheckToken thành true trong định nghĩa hàm:

    Node.js (thế hệ thứ 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 (thế hệ thứ 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. Cập nhật mã ứng dụng khách của ứng dụng để mua sản phẩm tiêu dùng có giới hạn sử dụng khi bạn gọi hàm này:

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