Proteger recursos que não são do Firebase com o App Check no Android

É possível proteger os recursos do seu app que não são do Firebase, como back-ends auto-hospedados, com App Check. Para isso, será necessário realizar as ações a seguir:

  • Modifique o cliente do app para enviar um token do App Check junto a cada solicitação para o back-end, conforme descrito nesta página.
  • Modifique seu back-end para exigir um token App Check válido em todas as solicitações, conforme descrito em Verificar tokens App Check de um back-end personalizado.

Antes de começar

Adicione App Check ao seu app usando o provedor da Play Integrity padrão ou um provedor personalizado.

Enviar tokens App Check com solicitações de back-end

Para garantir que suas solicitações de back-end incluam um token App Check válido e não expirado, una cada solicitação em uma chamada para getAppCheckToken(). A biblioteca do App Check atualizará o token, se necessário, e será possível acessar o token no listener de êxito do método.

Quando você tiver um token válido, envie com a solicitação para o back-end. Você decide como fazer isso, mas não envie tokens do App Check como parte dos URLs, inclusive nos parâmetros de consulta, porque isso os torna vulneráveis a vazamentos e interceptações acidentais. A abordagem recomendada é enviar o token em um cabeçalho HTTP personalizado.

Por exemplo, se você usar o 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);
                        // ...
                    }
                });
    }
}

Proteção contra repetição (Beta)

Ao fazer uma solicitação para um endpoint em que você ativou a proteção contra reprodução, una a solicitação em uma chamada para getLimitedUseAppCheckToken() em vez de 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();
                        // ...
                    }
                }
        );