在 Android 上使用 App Check 保護非 Firebase 資源

您可以使用 App Check 保護應用程式的非 Firebase 資源,例如自託管後端。為此,您需要執行以下兩項操作:

  • 修改您的應用程式用戶端,將應用程式檢查令牌與每個請求一起傳送到您的後端,如本頁所述。
  • 修改您的後端,使每個請求都需要有效的應用程式檢查令牌,如從自訂後端驗證應用程式檢查令牌中所述。

在你開始之前

使用預設的Play Integrity 提供者自訂提供者將 App Check 新增到您的應用程式。

透過後端請求發送 App Check 令牌

為了確保您的後端請求包含有效的、未過期的 App Check 令牌,請將每個請求包裝在對getAppCheckToken()的呼叫中。如果需要,App Check 庫將刷新令牌,您可以在方法的成功偵聽器中存取令牌。

獲得有效令牌後,將其與請求一起發送到後端。如何完成此操作的具體細節取決於您,但不要將 App Check 令牌作為 URL 的一部分(包括查詢參數)發送,因為這會使它們容易受到意外洩漏和攔截。建議的方法是在自訂 HTTP 標頭中傳送令牌。

例如,如果您使用 Retrofit:

Kotlin+KTX

class ApiWithAppCheckExample {
    interface YourExampleBackendService {
        @GET("yourExampleEndpoint")
        fun exampleData(
            @Header("X-Firebase-AppCheck") appCheckToken: String,
        ): Call<List<String>>
    }

    var yourExampleBackendService: YourExampleBackendService = Retrofit.Builder()
        .baseUrl("https://yourbackend.example.com/")
        .build()
        .create(YourExampleBackendService::class.java)

    fun callApiExample() {
        Firebase.appCheck.getAppCheckToken(false).addOnSuccessListener { appCheckToken ->
            val token = appCheckToken.token
            val apiCall = yourExampleBackendService.exampleData(token)
            // ...
        }
    }
}

Java

public class ApiWithAppCheckExample {
    private interface YourExampleBackendService {
        @GET("yourExampleEndpoint")
        Call<List<String>> exampleData(
                @Header("X-Firebase-AppCheck") String appCheckToken);
    }

    YourExampleBackendService yourExampleBackendService = new Retrofit.Builder()
            .baseUrl("https://yourbackend.example.com/")
            .build()
            .create(YourExampleBackendService.class);

    public void callApiExample() {
        FirebaseAppCheck.getInstance()
                .getAppCheckToken(false)
                .addOnSuccessListener(new OnSuccessListener<AppCheckToken>() {
                    @Override
                    public void onSuccess(@NonNull AppCheckToken appCheckToken) {
                        String token = appCheckToken.getToken();
                        Call<List<String>> apiCall =
                                yourExampleBackendService.exampleData(token);
                        // ...
                    }
                });
    }
}

重播保護(測試版)

當向已啟用重播保護的端點發出請求時,請將請求包裝在對getLimitedUseAppCheckToken()而不是getAppCheckToken()的呼叫中:

Kotlin+KTX

Firebase.appCheck.limitedUseAppCheckToken.addOnSuccessListener {
    // ...
}

Java

FirebaseAppCheck.getInstance()
        .getLimitedUseAppCheckToken().addOnSuccessListener(
                new OnSuccessListener<AppCheckToken>() {
                    @Override
                    public void onSuccess(AppCheckToken appCheckToken) {
                        String token = appCheckToken.getToken();
                        // ...
                    }
                }
        );