Android の App Check でカスタム バックエンド リソースを保護する

App Check を使用すると、アプリで使用する Google 以外のカスタム バックエンド リソース(独自のセルフホスト バックエンドなど)を保護できます。そのためには、次の両方を行う必要があります。

  • このページで説明するように、各リクエストとともに App Check トークンをバックエンドに送信するようにアプリ クライアントを変更します。
  • カスタム バックエンドからの App Check トークンの検証で説明したように、リクエストごとに有効な App Check トークンを要求するようにバックエンドを変更します。

始める前に

デフォルトの Play Integrity プロバイダまたはカスタム プロバイダを使用して、App Check をアプリに追加します。

バックエンド リクエストとともに App Check トークンを送信する

期限切れでない有効な App Check トークンをバックエンド リクエストに確実に含めるには、getAppCheckToken() の呼び出しでリクエストをラップします。App Check ライブラリが必要に応じてトークンを更新します。トークンにはメソッドの成功リスナーでアクセスできます。

有効なトークンを取得したら、リクエストと一緒にバックエンドに送信します。これを行う具体的な方法は自由に決めることができますが、クエリ パラメータを含め URL の一部として App Check トークンを送信しないでください。偶発的な漏洩や傍受に対して脆弱になります。カスタム 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);
                        // ...
                    }
                });
    }
}

リプレイ保護(ベータ版)

リプレイ保護を有効にしたエンドポイントに対してリクエストを行う場合は、getAppCheckToken() ではなく getLimitedUseAppCheckToken() への呼び出しでリクエストをラップします。

Kotlin

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

Java

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