在 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();
                        // ...
                    }
                }
        );