Melindungi resource non-Firebase dengan App Check di Android

Anda dapat melindungi resource non-Firebase aplikasi, seperti backend yang dihosting sendiri, dengan App Check. Untuk melakukannya, Anda harus melakukan kedua hal berikut:

  • Ubah klien aplikasi Anda untuk mengirim token App Check beserta setiap permintaan ke backend, seperti yang dijelaskan di halaman ini.
  • Ubah backend Anda agar mewajibkan token App Check yang valid untuk setiap permintaan, seperti yang dijelaskan dalam artikel Memverifikasi token App Check dari backend kustom.

Sebelum memulai

Tambahkan App Check ke aplikasi Anda menggunakan penyedia Play Integrity default atau penyedia kustom.

Mengirim token App Check dengan permintaan backend

Untuk memastikan permintaan backend Anda menyertakan token App Check yang valid dan belum habis masa berlakunya, gabungkan setiap permintaan dalam panggilan ke getAppCheckToken(). Jika diperlukan, library App Check akan memperbarui token dan Anda dapat mengakses token di pemroses peristiwa yang berhasil pada metode ini.

Setelah Anda memiliki token yang valid, kirimkan beserta permintaan ke backend Anda. Anda yang menentukan cara paling tepat untuk melakukannya, tetapi jangan kirim token App Check sebagai bagian dari URL, termasuk di parameter kueri. Hal ini akan membuat token rentan terhadap kebocoran dan intersepsi yang tidak sengaja. Pendekatan yang direkomendasikan adalah mengirim token dalam header HTTP kustom.

Misalnya, jika Anda menggunakan 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);
                        // ...
                    }
                });
    }
}

Perlindungan replay (beta)

Saat membuat permintaan ke endpoint untuk perlindungan replay yang telah diaktifkan, gabungkan permintaan dalam panggilan ke getLimitedUseAppCheckToken(), bukan 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();
                        // ...
                    }
                }
        );