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

Khi hiểu được ảnh hưởng của App Check đối với người dùng và sẵn sàng tiếp tục, bạn có thể bật tính năng thực thi App Check.

Bật tính năng thực thi

Để bắt đầu thực thi các yêu cầu về mã thông báo App Check trong Cloud Functions có thể gọi, hãy sửa đổi các hàm của bạn để kiểm tra mã thông báo App Check hợp lệ, như minh hoạ dưới đây. Sau khi bạn bật tính năng 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 SDK Cloud Functions.

    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 trở lê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 trở lê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 App Check 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 hàm:

    firebase deploy --only functions
    

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

Tính năng chống phát lại (thử nghiệm)

Để bảo vệ một hàm 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 mã thông báo Kiểm tra ứng dụng sau khi xác minh mã thông báo đó. Sau khi sử dụng, bạn không thể sử dụng lại mã thông báo.

Xin lưu ý rằng việc sử dụng tính năng chống phát lại sẽ thêm một lượt truy cập mạng vào quá trình xác minh mã thông báo, do đó sẽ làm tăng độ trễ cho lệnh gọi hàm trên đám mây. Vì lý do này, hầu hết ứng dụng thường chỉ bật tính năng chống phát lại trên các điểm cuối đặc biệt nhạy cảm.

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

  1. Trong Cloud Console, hãy cấp vai trò "Trình xác thực mã thông báo Firebase App Check" cho tài khoản dịch vụ mà Hàm trên đám mây sử dụng.

    • Nếu bạn đang khởi chạy rõ ràng SDK quản trị và đã chỉ định thông tin xác thực tài khoản dịch vụ SDK quản trị của dự án, thì vai trò bắt buộc đã được cấp.
    • Nếu bạn đang sử dụng các Hàm trên đám mây thế hệ 1 với cấu hình SDK quản trị mặc định, hãy cấp vai trò này cho tài khoản dịch vụ mặc định của App Engine. Xem bài vi���t Thay đổi quyền của tài khoản dịch vụ.
    • Nếu bạn đang sử dụng các Hàm trên đám mây thế hệ 2 với cấu hình SDK Quản trị mặc định, hãy cấp vai trò này cho Tài khoản dịch vụ điện toán mặc định.
  2. Đặt consumeAppCheckToken thành true trong phần khai báo hàm:

    Node.js (thế hệ thứ nhất)

    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 để lấy mã thông báo có thể sử dụng có giới hạn khi bạn gọi hàm:

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