Ochrona niestandardowych zasobów backendu za pomocą funkcji sprawdzania aplikacji na Androidzie

Możesz używać App Check do ochrony niestandardowych zasobów backendu aplikacji, które nie należą do Google, takich jak Twój własny backend hostowany samodzielnie. Aby to zrobić, musisz wykonać obie te czynności:

  • Zmodyfikuj klienta aplikacji, aby wysyłał token App Check z każdym żądaniem do backendu, jak opisano na tej stronie.
  • Zmodyfikuj backend, aby wymagał prawidłowego tokena App Check przy każdym żądaniu, zgodnie z opisem w artykule Weryfikowanie tokenów App Check z niestandardowego backendu.

Zanim zaczniesz

Dodaj App Check do aplikacji, korzystając z domyślnego dostawcy Play Integrity lub dostawcy niestandardowego.

Wysyłanie tokenów App Check z żądaniami backendu

Aby mieć pewność, że żądania backendu zawierają prawidłowy, niewygasły token App Check, opakuj każde żądanie w wywołanie getAppCheckToken(). Biblioteka App Check w razie potrzeby odświeży token, a Ty możesz uzyskać do niego dostęp w detektorze powodzenia metody.

Gdy będziesz mieć prawidłowy token, wyślij go wraz z żądaniem do backendu. Sposób, w jaki to zrobisz, zależy od Ciebie, ale nie wysyłaj tokenów App Check jako części adresów URL, w tym w parametrach zapytania, ponieważ może to spowodować ich przypadkowy wyciek i przechwycenie. Zalecanym podejściem jest wysyłanie tokena w niestandardowym nagłówku HTTP.

Jeśli na przykład używasz Retrofit:

Kotlin

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

Ochrona przed ponownym odtworzeniem (beta)

Podczas wysyłania żądania do punktu końcowego, dla którego włączono ochronę przed powtórzeniem, opakuj żądanie w wywołanie getLimitedUseAppCheckToken() zamiast getAppCheckToken():

Kotlin

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

Java

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