Catch up on everything we announced at this year's Firebase Summit. Learn more

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

本頁說明如何啟用的Android應用程序應用來查看,使用您的自定義應用程序檢查供應商。啟用 App Check 有助於確保只有您的應用可以訪問您項目的 Firebase 資源。

如果你想使用應用程序檢查與默認的安全網供應商,看看啟用Android應用程序檢查與安全網

在你開始之前

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

在你的模塊(應用程序級)搖籃文件(通常是app/build.gradle ),聲明依賴的應用程序查看Android庫:

爪哇

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

科特林+KTX

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

2. 實現 App Check 接口

首先,你需要創建一個實現類AppCheckProviderAppCheckProviderFactory接口。

AppCheckProvider類必須有一個getToken()方法,該方法收集的任何信息您的自定義應用程序檢查提供商要求的證件的真實性,並將其發送給您的令牌獲取的服務換取一個App檢查令牌。該應用程序檢查SDK手柄令牌緩存,所以總是得到一個新的令牌你的實現getToken()

爪哇

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;
    }
}

科特林+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實現:

爪哇

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

科特林+KTX

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

3. 初始化應用檢查

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

爪哇

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

科特林+KTX

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

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

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

4. 監控請求指標

現在您的更新應用已掌握在用戶手中,您可以為您使用的 Firebase 產品啟用 App Check 的強制執行。但是,在您這樣做之前,您應該確保這樣做不會干擾您現有的合法用戶。

實時數據庫、Cloud Firestore 和 Cloud Storage

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

要查看應用程序檢查請求指標的產物,打開項目設置>應用檢查的火力地堡控制台的部分。例如:

App Check 指標頁面的屏幕截圖

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

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

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

  • 來歷不明的請求是那些缺少應用程序檢查令牌,不要像他們來自火力地堡SDK。這些可能來自使用被盜 API 密鑰發出的請求或在沒有 Firebase SDK 的情況下發出的偽造請求。

  • 無效的請求是那些有一個無效的應用程序檢查令牌,這可能是從不真實客戶端試圖假冒您的應用程序,或從模擬環境。

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

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

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

  • 如果您的應用程序尚未啟動,您應該立即啟用 App Check 強制執行,因為沒有任何過時的客戶端在使用。

雲功能

對於 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
    }
  }
}

您可以通過分析在谷歌雲端控制台這些指標建立一個日誌,基於計數器的度量與以下數據過濾器:

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. 打開項目設置>應用程序檢查的火力地堡控制台部分。

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

  3. 點擊強制執行,並確認您的選擇。

請注意,啟用強制執行後最多可能需要 10 分鐘才能生效。

雲功能

請參閱啟用應用檢查執法雲功能