Androidのカスタムプロバイダーでアプリチェックを有効にする

このページでは、カスタム App Check プロバイダを使用して、Android アプリで App Check を有効にする方法について説明します。 App Check を有効にすると、アプリのみがプロジェクトの Firebase リソースにアクセスできるようになります。

デフォルトの Play Integrity プロバイダーで App Check を使用する場合は、Android で Play Integrityを使用して App Check を有効にする を参照してください。

あなたが始める前に

1. App Check ライブラリをアプリに追加する

モジュール (アプリ レベル) の Gradle ファイル (通常はapp/build.gradle ) で、App Check Android ライブラリの依存関係を宣言します。

Java

dependencies {
    implementation 'com.google.firebase:firebase-appcheck:16.0.0'
}

Kotlin+KTX

dependencies {
    implementation 'com.google.firebase:firebase-appcheck:16.0.0'
}

2. App Check インターフェースを実装する

最初に、 AppCheckProviderおよびAppCheckProviderFactoryインターフェースを実装するクラスを作成する必要があります。

AppCheckProviderクラスにはgetToken()メソッドが必要です。このメソッドは、カスタム App Check プロバイダーが信頼性の証明として必要とするあらゆる情報を収集し、それを App Check トークンと引き換えにトークン取得サービスに送信します。 App Check SDK はトークンのキャッシュを処理するため、 getToken()の実装で常に新しいトークンを取得してください。

Java

public class YourCustomAppCheckToken extends AppCheckToken {
    private String token;
    private long expiration;

    YourCustomAppCheckToken(String token, long expiration) {
        this.token = token;
        this.expiration = expiration;
    }

    @NonNull
    @Override
    public String getToken() {
        return token;
    }

    @Override
    public long getExpireTimeMillis() {
        return expiration;
    }
}

public class YourCustomAppCheckProvider implements AppCheckProvider {
    @Override
    public Task<AppCheckToken> getToken() {
        // Logic to exchange proof of authenticity for an App Check token and
        //   expiration time.
        // ...

        // Refresh the token early to handle clock skew.
        long expMillis = expirationFromServer * 1000 - 60000;

        // Create AppCheckToken object.
        AppCheckToken appCheckToken =
                YourCustomAppCheckToken(tokenFromServer, expMillis);

        return appCheckToken;
    }
}

Kotlin+KTX

class YourCustomAppCheckToken(
    private val token: String,
    private val expiration: Long
) : AppCheckToken() {
    override fun getToken(): String {
        return token
    }

    override fun getExpireTimeMillis(): Long {
        return expiration
    }
}

class YourCustomAppCheckProvider : AppCheckProvider {
    val token: Task<AppCheckToken>
        get() {
            // Logic to exchange proof of authenticity for an App Check token.
            // ...

            // Refresh the token early to handle clock skew.
            val expMillis: Long = expirationFromServer * 1000 - 60000

            // Create AppCheckToken object.
            val appCheckToken: AppCheckToken =
                    YourCustomAppCheckToken(tokenFromServer, expMillis)

            return appCheckToken!
        }
}

また、 AppCheckProvider実装のインスタンスを作成するAppCheckProviderFactoryクラスを実装します。

Java

public class YourCustomAppCheckProviderFactory implements AppCheckProviderFactory {
  @Override
  public AppCheckProvider create(FirebaseApp firebaseApp) {
    // Create and return an AppCheckProvider object.
    return new YourCustomAppCheckProvider(firebaseApp);
  }
}

Kotlin+KTX

class YourCustomAppCheckProviderFactory : AppCheckProviderFactory {
    fun create(firebaseApp: FirebaseApp): AppCheckProvider {
        // Create and return an AppCheckProvider object.
        return YourCustomAppCheckProvider(firebaseApp)
    }
}

3.アプリチェックの初期化

次の初期化コードをアプリに追加して、他の Firebase SDK を使用する前にアプリが実行されるようにします。

Java

FirebaseApp.initializeApp(/*context=*/ this);
FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
firebaseAppCheck.installAppCheckProviderFactory(
    YourCustomAppCheckProviderFactory.getInstance());

Kotlin+KTX

FirebaseApp.initializeApp(/*context=*/ this)
val firebaseAppCheck = FirebaseAppCheck.getInstance()
firebaseAppCheck.installAppCheckProviderFactory(
    YourCustomAppCheckProviderFactory.getInstance())

App Check ライブラリがアプリにインストールされたら、更新されたアプリのユーザーへの配布を開始します。

更新されたクライアント アプリは、Firebase へのすべてのリクエストとともに App Check トークンの送信を開始しますが、Firebase コンソールの App Check セクションで適用を有効にするまで、Firebase 製品ではトークンが有効である必要はありません。詳細については、次の 2 つのセクションを参照してください。

4. リクエストの指標を監視する

更新したアプリがユーザーの手に渡るようになったので、使用する Firebase プロダクトに対して App Check の適用を有効にできます。ただし、その前に、既存の正当なユーザーが混乱しないことを確認する必要があります。

Realtime Database、Cloud Firestore、Cloud Storage

Realtime Database、Cloud Firestore、および Cloud Storage についてこの決定を行うために使用できる重要なツールは、App Check リクエスト メトリック画面です。

製品の App Check リクエスト メトリックを表示するには、Firebase コンソールのApp Checkセクションを開きます。例えば:

App Check メトリクス ページのスクリーンショット

各製品のリクエスト メトリックは、次の 4 つのカテゴリに分類されます。

  • 検証済みのリクエストは、有効な App Check トークンを持つリクエストです。 App Check の実施を有効にすると、このカテゴリのリクエストのみが成功します。

  • 古いクライアント要求は、App Check トークンが欠落している要求です。これらのリクエストは、App Check がアプリに含まれる前の古いバージョンの Firebase SDK からのものである可能性があります。

  • 不明なオリジンリクエストは、App Check トークンが欠落しており、Firebase SDK から送信されたようには見えません。これらは、盗まれた API キーを使用して作成されたリクエスト、または Firebase SDK を使用せずに作成された偽造リクエストによるものである可能性があります。

  • 無効なリクエストとは、無効な App Check トークンを持つリクエストです。これは、アプリになりすまそうとする認証されていないクライアントからのもの、またはエミュレートされた環境からのものである可能性があります。

アプリのこれらのカテゴリの分布は、適用を有効にすることを決定したときに通知する必要があります。以下にいくつかのガイドラインを示します。

  • 最近のリクエストのほとんどすべてが確認済みのクライアントからのものである場合は、適用を有効にしてバックエンド リソースの保護を開始することを検討してください。

  • 最近のリクエストの大部分が古い可能性のあるクライアントからのものである場合、ユーザーの混乱を避けるために、適用を有効にする前に、より多くのユーザーがアプリを更新するのを待つことを検討してください。リリースされたアプリに App Check を適用すると、App Check SDK と統合されていない以前のアプリ バージョンが壊れます。

  • アプリがまだ起動していない場合は、古いクライアントが使用されていないため、すぐに App Check の適用を有効にする必要があります。

クラウド機能

Cloud Functions の場合、関数のログを調べることで App Check 指標を取得できます。呼び出し可能な関数を呼び出すたびに、次の例のような構造化されたログ エントリが出力されます。

{
  "severity": "INFO",    // INFO, WARNING, or ERROR
  "logging.googleapis.com/labels": {"firebase-log-type": "callable-request-verification"},
  "jsonPayload": {
    "message": "Callable header verifications passed.",
    "verifications": {
      // ...
      "app": "MISSING",  // VALID, INVALID, or MISSING
    }
  }
}

次の指標フィルタを使用してログベースのカウンタ指標を作成することにより、Google Cloud Console でこれらの指標を分析できます。

resource.type="cloud_function"
resource.labels.function_name="YOUR_CLOUD_FUNCTION"
resource.labels.region="us-central1"
labels.firebase-log-type="callable-request-verification"

フィールドjsonPayload.verifications.appCheckを使用してメトリクスにラベルを付けます。

5.強制を有効にする

適用を有効にするには、以下の各製品の手順に従ってください。製品の適用を有効にすると、その製品に対する未確認のリクエストはすべて拒否されます。

Realtime Database、Cloud Firestore、Cloud Storage

Realtime Database、Cloud Firestore (iOS および Android)、Cloud Storage の適用を有効にするには:

  1. Firebase コンソールのApp Checkセクションを開きます。

  2. 適用を有効にする製品のメトリック ビューを展開します。

  3. [強制]をクリックして、選択内容を確認します。

強制を有効にしてから有効になるまで、最大 15 分かかる場合があることに注意してください。

クラウド機能

Cloud Functions の App Check 実施を有効にする を参照してください。