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

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

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

Zanim zaczniesz

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

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

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

Gdy uzyskasz 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 w adresach URL, w tym w parametrach zapytania, ponieważ sprawia to, że są one podatne na przypadkowe wycieki i przechwytywanie. Zalecane podejście polega na wysyłaniu tokena w niestandardowym nagłówku HTTP.

Jeśli na przykład używasz biblioteki 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 powtórzeniem (beta)

Gdy wysyłasz żądanie do punktu końcowego, w przypadku którego masz włączoną ochronę przed powtórzeniem, umieść je w wywołaniu funkcji 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();
                        // ...
                    }
                }
        );