在 Android 上使用自定義提供程序啟用 App Check

此頁面向您展示如何使用您的自定義 App Check 提供程序在 Android 應用中啟用 App Check。當您啟用 App Check 時,您有助於確保只有您的應用可以訪問您項目的 Firebase 資源。

如果您想將 App Check 與默認的 Play Integrity 提供程序一起使用,請參閱在 Android 上使用 Play Integrity 啟用 App Check

在你開始之前

1. 將 App Check 庫添加到您的應用中

在您的模塊(應用級)Gradle 文件(通常是app/build.gradle )中,聲明 App Check Android 庫的依賴項:

Java

dependencies {
    implementation 'com.google.firebase:firebase-appcheck:16.0.0'
}

Kotlin+KTX

dependencies {
    implementation 'com.google.firebase:firebase-appcheck:16.0.0'
}

2.實現App Check接口

首先,您需要創建實現AppCheckProviderAppCheckProviderFactory接口的類。

您的AppCheckProvider類必須有一個 getToken getToken()方法,該方法收集您的自定義 App Check 提供程序作為真實性證明所需的任何信息,並將其發送到您的令牌獲取服務以換取 App Check 令牌。 App Check SDK 處理令牌緩存,因此始終在您的getToken()實現中獲取新令牌。

Java

public class YourCustomAppCheckToken extends AppCheckToken {
    private String token;
    private long expiration;

    YourCustomAppCheckToken(String token, long expiration) {
        this.token = token;
        this.expiration = expiration;
    }

    @NonNull
    @Override
    public String getToken() {
        return token;
    }

    @Override
    public long getExpireTimeMillis() {
        return expiration;
    }
}

public class YourCustomAppCheckProvider implements AppCheckProvider {
    @Override
    public Task<AppCheckToken> getToken() {
        // Logic to exchange proof of authenticity for an App Check token and
        //   expiration time.
        // ...

        // Refresh the token early to handle clock skew.
        long expMillis = expirationFromServer * 1000 - 60000;

        // Create AppCheckToken object.
        AppCheckToken appCheckToken =
                YourCustomAppCheckToken(tokenFromServer, expMillis);

        return appCheckToken;
    }
}

Kotlin+KTX

class YourCustomAppCheckToken(
    private val token: String,
    private val expiration: Long
) : AppCheckToken() {
    override fun getToken(): String {
        return token
    }

    override fun getExpireTimeMillis(): Long {
        return expiration
    }
}

class YourCustomAppCheckProvider : AppCheckProvider {
    val token: Task<AppCheckToken>
        get() {
            // Logic to exchange proof of authenticity for an App Check token.
            // ...

            // Refresh the token early to handle clock skew.
            val expMillis: Long = expirationFromServer * 1000 - 60000

            // Create AppCheckToken object.
            val appCheckToken: AppCheckToken =
                    YourCustomAppCheckToken(tokenFromServer, expMillis)

            return appCheckToken!
        }
}

此外,實現一個AppCheckProviderFactory類來創建您的AppCheckProvider實現的實例:

Java

public class YourCustomAppCheckProviderFactory implements AppCheckProviderFactory {
  @Override
  public AppCheckProvider create(FirebaseApp firebaseApp) {
    // Create and return an AppCheckProvider object.
    return new YourCustomAppCheckProvider(firebaseApp);
  }
}

Kotlin+KTX

class YourCustomAppCheckProviderFactory : AppCheckProviderFactory {
    fun create(firebaseApp: FirebaseApp): AppCheckProvider {
        // Create and return an AppCheckProvider object.
        return YourCustomAppCheckProvider(firebaseApp)
    }
}

3.初始化應用檢查

將以下初始化代碼添加到您的應用中,以便它在您使用任何其他 Firebase SDK 之前運行:

Java

FirebaseApp.initializeApp(/*context=*/ this);
FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
firebaseAppCheck.installAppCheckProviderFactory(
    YourCustomAppCheckProviderFactory.getInstance());

Kotlin+KTX

FirebaseApp.initializeApp(/*context=*/ this)
val firebaseAppCheck = FirebaseAppCheck.getInstance()
firebaseAppCheck.installAppCheckProviderFactory(
    YourCustomAppCheckProviderFactory.getInstance())

在您的應用中安裝 App Check 庫後,開始將更新的應用分發給您的用戶。

更新後的客戶端應用將開始向 Firebase 發出的每個請求發送 App Check 令牌,但 Firebase 產品不需要令牌有效,直到您在 Firebase 控制台的 App Check 部分啟用強制執行。有關詳細信息,請參閱接下來的兩節。

4. 監控請求指標

現在您的更新應用已在用戶手中,您可以為您使用的 Firebase 產品啟用應用檢查。但是,在您這樣做之前,您應該確保這樣做不會破壞您現有的合法用戶。

實時數據庫、Cloud Firestore 和 Cloud Storage

您可以用來為實時數據庫、Cloud Firestore 和 Cloud Storage 做出此決定的一個重要工具是應用檢查請求指標屏幕。

要查看產品的 App Check 請求指標,請打開 Firebase 控制台的App Check部分。例如:

應用檢查指標頁面的屏幕截圖

每個產品的請求指標分為四類:

  • 已驗證的請求是那些具有有效 App Check 令牌的請求。啟用 App Check 強制執行後,只有此類別中的請求才會成功。

  • 過時的客戶端請求是那些缺少 App Check 令牌的請求。這些請求可能來自應用檢查未包含在應用中之前的舊版 Firebase SDK。

  • 未知來源請求是那些缺少應用檢查令牌的請求,它們看起來不像來自 Firebase SDK。這些請求可能來自使用被盜 API 密鑰發出的請求,也可能來自未使用 Firebase SDK 發出的偽造請求。

  • 無效請求是那些具有無效應用檢查令牌的請求,這些請求可能來自試圖模擬您的應用的不真實客戶端,或來自模擬環境。

當您決定啟用強制執行時,您的應用程序的這些類別的分佈應通知您。以下是一些指導方針:

  • 如果幾乎所有最近的請求都來自經過驗證的客戶端,請考慮啟用強制措施以開始保護您的後端資源。

  • 如果最近的請求中有很大一部分來自可能已過時的客戶端,為避免干擾用戶,請考慮等待更多用戶更新您的應用,然後再啟用強制執行。對已發布的應用程序強制執行應用程序檢查將破壞未與應用程序檢查 SDK 集成的先前應用程序版本。

  • 如果您的應用尚未啟動,您應該立即啟用應用檢查強制,因為沒有任何過時的客戶端在使用中。

雲函數

對於 Cloud Functions,您可以通過檢查函數的日誌來獲取 App Check 指標。每次調用可調用函數都會發出一個結構化日誌條目,如下例所示:

{
  "severity": "INFO",    // INFO, WARNING, or ERROR
  "logging.googleapis.com/labels": {"firebase-log-type": "callable-request-verification"},
  "jsonPayload": {
    "message": "Callable header verifications passed.",
    "verifications": {
      // ...
      "app": "MISSING",  // VALID, INVALID, or MISSING
    }
  }
}

您可以通過使用以下指標過濾器創建基於日誌的計數器指標,在 Google Cloud Console 中分析這些指標:

resource.type="cloud_function"
resource.labels.function_name="YOUR_CLOUD_FUNCTION"
resource.labels.region="us-central1"
labels.firebase-log-type="callable-request-verification"

使用字段jsonPayload.verifications.appCheck標記指標

5. 啟用強制執行

要啟用強制執行,請按照以下每種產品的說明進行操作。為產品啟用強制執行後,對該產品的所有未經驗證的請求都將被拒絕。

實時數據庫、Cloud Firestore 和 Cloud Storage

要為實時數據庫、Cloud Firestore(iOS 和 Android)和 Cloud Storage 啟用強制執行:

  1. 打開 Firebase 控制台的應用檢查部分。

  2. 展開您要為其啟用強制執行的產品的指標視圖。

  3. 單擊強制並確認您的選擇。

請注意,啟用強制實施後最多可能需要 15 分鐘才能生效。

雲函數

請參閱為 Cloud Functions 啟用應用檢查強制