Как защитить собственные ресурсы бэкенда с помощью Проверки приложений на 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();
                        // ...
                    }
                }
        );