在 Android 上使用 App Check 保护非 Firebase 资源

您可以使用 App Check 保护应用的非 Firebase 资源,例如自托管后端。为此,您需要执行以下两项操作:

  • 如本页所述,修改您的应用客户端以将应用检查令牌与每个请求一起发送到您的后端。
  • 修改您的后端,以在每个请求中都需要一个有效的 App Check 令牌,如从自定义后端验证 App Check 令牌中所述

在你开始之前

使用默认SafetyNet 提供程序自定义提供程序将 App Check 添加到您的应用程序。

使用后端请求发送 App Check 令牌

为确保您的后端请求包含有效的、未过期的 App Check 令牌,请将每个请求包装在对getAppCheckToken()的调用中。 App Check 库将在必要时刷新令牌,您可以在方法的成功侦听器中访问令牌。

获得有效令牌后,将其与请求一起发送到后端。具体如何完成此操作取决于您,但不要将 App Check 令牌作为 URL 的一部分发送,包括在查询参数中,因为这会使它们容易受到意外泄漏和拦截。推荐的方法是在自定义 HTTP 标头中发送令牌。

例如,如果您使用改造:

爪哇

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 tokenResponse) {
                        String appCheckToken = tokenResponse.getToken();
                        Call<List<String>> apiCall =
                                yourExampleBackendService.exampleData(appCheckToken);
                        // ...
                    }
                });
    }
}

科特林+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() {
        FirebaseAppCheck.getInstance()
            .getAppCheckToken(false)
            .addOnSuccessListener { tokenResponse ->
                val appCheckToken = tokenResponse.token
                val apiCall = yourExampleBackendService.exampleData(appCheckToken)
                // ...
            }
    }
}