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 の統合を計画する際の考慮事項

  • 証明書プロバイダの割り当て: 推奨される証明書プロバイダである 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 トークンがないすべてのトラフィックを拒否します。