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

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

  • 按照本頁所述,修改應用程式用戶端,將 App Check 權杖連同每項要求一併傳送至後端。
  • 修改後端,要求每項要求都提供有效的 App Check 權杖,如「從自訂後端驗證 App Check 權杖」一文所述。

事前準備

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

透過後端要求傳送 App Check 權杖

為確保後端要求包含有效且未過期的 App Check 權杖,請在呼叫 getAppCheckToken() 時包裝每項要求。App Check 程式庫會視需要重新整理權杖,您可以在方法的成功事件監聽器中存取權杖。

取得有效的權杖後,請將該權杖與要求傳送至後端。具體做法由您決定,但請勿將 App Check 權杖當做網址的一部分傳送 (包括查詢參數),否則容易遭受意外外洩和攔截。建議您透過自訂 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);
                        // ...
                    }
                });
    }
}

重播防護措施 (Beta 版)

向已啟用重播保護的端點提出要求時,請在對 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();
                        // ...
                    }
                }
        );