App Check を使用して Navigation SDK for Android を保護する

Firebase App Check は、正規のアプリ以外のソースから送信されたトラフィックをブロックすることで、アプリから Google Maps Platform への呼び出しを保護します。これを行うには、Play Integrity などの証明書プロバイダにアプリまたはデバイスの真正性の評価をリクエストします。アプリを App Check と統合すると、悪意のあるリクエストや不正なリクエストからアプリを保護できます。これにより、不正な請求から課金を保護できます。App Check は、フリートアプリのエコシステムにおけるリアルタイムの障害報告も大幅に改善するため、アプリを使用するすべてのドライバーにメリットをもたらします。詳しくは、障害報告をご覧ください。

App Check を使用する理由

App Check は、Navigation SDK for Android の 2 つの異なる領域(メインのナビゲーション機能と交通情報レポート)を保護します。

App Check は、悪意のあるソースや不正なソースからの Navigation SDK for Android のメイン リクエストをブロックするのに役立ちます。これにより、請求詐欺や割り当ての枯渇からプロジェクトを保護できるため、お客様に直接的なメリットがあります。

運行状況の報告

アプリがリアルタイムの運行状況レポートと投票機能をサポートしている場合は、App Check を使用することを強くおすすめします。App Check を有効にすると、すべてのリアルタイム フィードバックを考慮した最も正確なルートがドライバーに提供されます。

レポートで App Check が重要な理由:

  • 通行止めに関する高い信頼性基準: 道路の通行止めなど、ルートに影響を与えるイベントは、すべてのドライバーのルート設定に大きな影響を与える可能性があります。潜在的な破壊行為、スパム、不正確な報告から地図を保護するため、通行止めに関する Google のモデレーション インフラストラクチャは、デバイスとアプリの完全性の強力なシグナルに依存しています。
  • App Check によるレポートの検証方法: Navigation SDK for Android から送信されるユーザー レポートと投票には、App Check トークンが含まれています。このトークンは、Google のバックエンドでフィードバックの正当性を検証するために使用されます。これにより、信頼レベルが向上し、公開中の地図への影響を評価できるようになります。
  • App Check を省略した場合の影響: 有効な App Check トークンなしで送信されたレポートは、信頼性の低いモデルで評価され、サイレント シグナルとしてのみ処理される可能性があります。つまり、ユーザーは引き続き報告や投票を行うことができますが、その報告が地図に表示されたり、他のドライバーのルートに影響を与えたりする可能性は低くなり、追加の検証が必要になります。

App Check は私に適していますか?

ほとんどの場合、App Check を使用することをおすすめしますが、次のシナリオでは App Check は不要、またはサポートされていません。

  • 非公開アプリまたは試験運用版アプリ: アプリが一般公開されていない場合、App Check は必要ありません。
  • 不正使用されたデバイス: 推奨される証明書プロバイダは、root 権限取得または制限解除されているスマートフォンなど、信頼できないデバイスで Navigation SDK for Android が実行されないようにします。これらのデバイスをサポートするには、カスタム構成証明プロバイダをデプロイします。
  • GMS 以外の Android デバイス: Android デバイスで Play Integrity を使用するには、Google モバイル サービス(GMS)が実行されている必要があります。GMS 以外の Android デバイスをサポートする予定がある場合は、カスタム構成証明プロバイダをデプロイします。

実装手順の概要

大まかには、次の手順でアプリを App Check と統合します。

  1. Firebase をアプリに追加します。
  2. App Check ライブラリを追加し、App Check を初期化します。
  3. トークン プロバイダを追加します。このステップでは、選択した証明書プロバイダを呼び出して、デバイスまたはアプリの完全性を検証します。
  4. Navigation API と App Check API を初期化します。
  5. デバッグを有効にします。これは、開発中や継続的インテグレーション(CI)環境で役立ちます。
  6. 適用を有効にする前に、アプリのリクエストをモニタリングします。これにより、ユーザーに影響を与えることなく App Check をシームレスに適用できます。

App Check の統合を計画する際の考慮事項

  • 証明書プロバイダの割り当て: Google が推奨する証明書プロバイダである Play Integrity には、Standard API の使用枠に対して 1 日あたりの呼び出し回数の上限があります。呼び出しの上限について詳しくは、Google Play Integrity デベロッパー ドキュメントの設定ページをご覧ください。
  • 起動時のレイテンシ: ほとんどの場合、App Check トークンはデバイスにキャッシュされるため、通常の利用中にレイテンシが発生することはありません。システムは、シームレスなパフォーマンスを維持するために、有効期限が切れる前にバックグラウンドで App Check トークンを自動的に更新します。ただし、有効な App Check トークンが存在しない場合、アプリのユーザーは起動時に遅延が発生します。たとえば、このレイテンシは、キャッシュに保存されたトークンが期限切れになっているか、存在しない場合のコールド スタート中に発生します。
  • トークンの TTL: 有効期間(TTL)は、App Check トークンが更新されるまでの有効期間を決定します。この期間は、Firebase コンソールで 30 分から 7 日の範囲で構成できます。安全なベースラインとして 1 時間の期間が推奨されますが、SDK は TTL 期間の約半分でバックグラウンド更新を自動的に試行します。コンソールでの手順については、Firebase App Check のドキュメントをご覧ください。

アプリを App Check と統合する

前提条件と要件

  • Navigation SDK for Android バージョン 7.9 以降がインストールされているアプリ。
  • アプリの SHA-256 証明書フィンガープリント。
  • アプリのパッケージ名。
  • Google Cloud コンソールでアプリのオーナーである必要があります。
  • Google Cloud コンソールから取得したアプリのプロジェクト ID。

ステップ 1: Firebase をアプリに追加する

Firebase デベロッパー ドキュメントの手順に沿って、アプリに Firebase を追加します。google-services.json ファイルをプロジェクトのアプリレベルのディレクトリに追加します。

ステップ 2: App Check ライブラリを追加して App Check を初期化する

アプリの build.gradle ファイルに App Check の依存関係を追加します。

Groovy(build.gradle)

dependencies {
    // Import the Firebase BoM
    implementation platform('com.google.firebase:firebase-bom:34.17.0')
    // Add the dependency for the App Check library with Play Integrity
    implementation 'com.google.firebase:firebase-appcheck-playintegrity'
}

Application クラスまたはメイン アクティビティで App Check を初期化します。

Java

import com.google.firebase.FirebaseApp;
import com.google.firebase.appcheck.FirebaseAppCheck;
import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory;

// Initialize Firebase App
FirebaseApp.initializeApp(/* context= */ this);

// Initialize App Check
FirebaseAppCheck firebaseAppCheck = FirebaseAppCheck.getInstance();
firebaseAppCheck.installAppCheckProviderFactory(
    PlayIntegrityAppCheckProviderFactory.getInstance());

Kotlin

import com.google.firebase.Firebase
import com.google.firebase.appcheck.appCheck
import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory
import com.google.firebase.initialize

// Initialize Firebase App
Firebase.initialize(context = this)

// Initialize App Check
Firebase.appCheck.installAppCheckProviderFactory(
    PlayIntegrityAppCheckProviderFactory.getInstance(),
)

ステップ 3: トークン プロバイダを追加する

MapsAppCheckTokenProvider インターフェースの実装を作成します。このプロバイダは、Firebase App Check から App Check トークンを非同期で取得し、MapsAppCheckTokenCallback を使用して Navigation SDK for Android ネットワーク スタックに渡します。

Java

import com.google.android.gms.maps.MapsAppCheckTokenCallback;
import com.google.android.gms.maps.MapsAppCheckTokenProvider;
import com.google.firebase.appcheck.FirebaseAppCheck;

public class NavigationTokenProvider implements MapsAppCheckTokenProvider {
  @Override
  public void fetchToken(MapsAppCheckTokenCallback callback) {
    FirebaseAppCheck.getInstance()
        .getAppCheckToken(false) // forcingRefresh = false
        .addOnSuccessListener(
            tokenResult -> {
              String token = tokenResult.getToken();
              callback.onSuccess(token);
            })
        .addOnFailureListener(
            e -> {
              callback.onFailure();
            });
  }
}

Kotlin

import com.google.android.gms.maps.MapsAppCheckTokenCallback
import com.google.android.gms.maps.MapsAppCheckTokenProvider
import com.google.firebase.appcheck.FirebaseAppCheck

class NavigationTokenProvider : MapsAppCheckTokenProvider {
    override fun fetchToken(callback: MapsAppCheckTokenCallback) {
        FirebaseAppCheck.getInstance()
            .getAppCheckToken(false)
            .addOnSuccessListener { tokenResult ->
                callback.onSuccess(tokenResult.token)
            }
            .addOnFailureListener {
                callback.onFailure()
            }
    }
}

ステップ 4: Navigation API と App Check API を初期化する

Navigation SDK for Android を初期化し、MapsApiSettings.setAppCheckTokenProvider() を使用して統合トークン プロバイダ インスタンスを登録します。

Java

import com.google.android.gms.maps.MapsApiSettings;

// Register your App Check token provider before initializing Navigation SDK for Android
MapsApiSettings.setAppCheckTokenProvider(context, new NavigationTokenProvider());

Kotlin

import com.google.android.gms.maps.MapsApiSettings

// Register your App Check token provider before initializing Navigation SDK for Android
MapsApiSettings.setAppCheckTokenProvider(context, NavigationTokenProvider())

ステップ 5: デバッグを有効にする(省略可)

Navigation SDK for Android で App Check が適用されると、Navigation SDK for Android に依存するアプリの機能は、シミュレータまたは継続的インテグレーション(CI)環境から実行できなくなります。これらの環境は有効なデバイスとして認識されないためです。開発中やテスト中にこのような環境でアプリを実行する場合は、本番環境の証明書プロバイダの代わりに App Check デバッグ プロバイダを使用するようにアプリのデバッグビルドを作成する必要があります。

  1. アプリの build.gradle ファイルにデバッグ プロバイダの依存関係を追加します。

    Groovy(build.gradle)

    dependencies {
        implementation 'com.google.firebase:firebase-appcheck-debug'
    }
  2. デバッグビルドでデバッグ プロバイダ ファクトリを使用するように App Check を構成します。

    Java

    import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory;
    import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory;
    
    if (BuildConfig.DEBUG) {
        firebaseAppCheck.installAppCheckProviderFactory(
            DebugAppCheckProviderFactory.getInstance()
        );
    } else {
        firebaseAppCheck.installAppCheckProviderFactory(
            PlayIntegrityAppCheckProviderFactory.getInstance()
        );
    }

    Kotlin

    import com.google.firebase.Firebase
    import com.google.firebase.appcheck.appCheck
    import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory
    import com.google.firebase.appcheck.playintegrity.PlayIntegrityAppCheckProviderFactory
    
    if (BuildConfig.DEBUG) {
        Firebase.appCheck.installAppCheckProviderFactory(
            DebugAppCheckProviderFactory.getInstance(),
        )
    } else {
        Firebase.appCheck.installAppCheckProviderFactory(
            PlayIntegrityAppCheckProviderFactory.getInstance(),
        )
    }
  3. エミュレータまたはデバッグ デバイスでアプリを起動します。App Check は、ローカル デバッグ トークンを logcat 出力に出力します。
  4. このデバッグトークンをコピーして Firebase コンソールに登録します。詳しくは、Firebase App Check デバッグ プロバイダのドキュメントをご覧ください。

ステップ 6: アプリのリクエストをモニタリングし、違反措置を決定する

適用を有効にする前に、アプリのリクエストをモニタリングして、正規ユーザーを中断しないようにします。

  1. Firebase コンソールの App Check 指標画面にアクセスして、検証済みトラフィックと未検証トラフィックの割合を確認します。
  2. トラフィックの大部分が検証され、正規ユーザーが App Check の実装を含むアプリのバージョンに更新したことを確認したら、適用を有効にします。
  3. 適用を有効にすると、有効な App Check トークンのないすべてのトラフィックが App Check によって拒否されます。