Защитите пользовательские серверные ресурсы с помощью App Check на Android

Вы можете использовать App Check для защиты сторонних бэкенд-ресурсов вашего приложения, например, вашего собственного бэкенда, размещенного на вашем сервере. Для этого вам необходимо выполнить два следующих действия:

  • Измените клиентское приложение так, чтобы оно отправляло токен App Check вместе с каждым запросом на ваш бэкэнд, как описано на этой странице.
  • Измените свой бэкэнд так, чтобы он требовал действительный токен App Check при каждом запросе, как описано в разделе Проверка токенов App Check из пользовательского бэкэнда .

Прежде чем начать

Добавьте App Check в свое приложение, используя либо поставщика Play Integrity по умолчанию, либо пользовательского поставщика .

Отправлять токены App Check с внутренними запросами

Чтобы убедиться, что ваши внутренние запросы содержат действительный, неистекший токен App Check , заключите каждый запрос в вызов getAppCheckToken() . Библиотека App Check обновит токен при необходимости, и вы сможете получить к нему доступ в прослушивателе событий успеха метода.

Получив действительный токен, отправьте его вместе с запросом в бэкенд. Вы можете выбрать, как это сделать, но не отправляйте токены App Check в составе URL-адресов , в том числе в параметрах запроса, так как это делает их уязвимыми для случайной утечки и перехвата. Рекомендуемый подход — отправлять токен в настраиваемом HTTP-заголовке.

Например, если вы используете 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);
                        // ...
                    }
                });
    }
}

Защита от повторного воспроизведения (бета)

При выполнении запроса к конечной точке, для которой включена защита от повторного воспроизведения , заключите запрос в вызов getLimitedUseAppCheckToken() вместо getAppCheckToken() :

Kotlin

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

Java

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