App Check を使用して API キーを保護する

Firebase App Check は、正当なアプリ以外のソースから送信されたトラフィックをブロックすることで、アプリから Google Maps Platform への呼び出しを保護します。これは、App Attest などの証明書プロバイダのトークンをチェックすることで行われます。アプリを App Check と統合すると、悪意のあるリクエストから保護されるため、不正な API 呼び出しに対して料金が発生することはありません。

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

ほとんどの場合、App Check の使用をおすすめしますが、次のケースでは App Check は必要ないか、サポートされていません。

  • 元の Places SDK を使用している。App Check は Places SDK(新規)でのみサポートされています
  • 限定公開アプリまたは試験運用版アプリ。アプリが一般公開されていない場合は、App Check は必要ありません。
  • アプリがサーバー間通信でのみ使用される場合は、App Check は必要ありません。ただし、GMP と通信するサーバーが一般公開されているクライアント(モバイルアプリなど)で使用されている場合は、GMP ではなく App Check を使用してそのサーバーを保護することを検討してください。
  • App Check で推奨される証明書プロバイダは、証明書プロバイダによって不正使用されているか信頼できないと判断されたデバイスでは機能しません。このようなデバイスをサポートする必要がある場合は、カスタム構成証明サービスをデプロイできます。詳しくは、手順をご覧ください。

実装手順の概要

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

  1. Firebase をアプリに追加します。
  2. App Check ライブラリを追加して初期化します。
  3. トークン プロバイダをアプリに追加します。
  4. Places API と App Check API を初期化します。
  5. デバッグを有効にします。
  6. アプリのリクエストをモニタリングし、適用を決定します。

App Check を統合すると、Firebase コンソールでバックエンド トラフィックの指標を確認できるようになります。これらの指標は、有効な App Check トークンが付加されているかどうかでリクエストの内訳を示します。詳細については、Firebase App Check のドキュメントをご覧ください。

ほとんどのリクエストが正当なソースからのものであり、ユーザーが App Check の実装を含む最新バージョンのアプリに更新していることを確認できたら、適用を有効にできます。適用を有効にすると、App Check は有効な App Check トークンのないすべてのトラフィックを拒否します。

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

統合を計画する際に考慮すべき点は次のとおりです。

  • 推奨される証明書プロバイダである Device Check または App Attest には、Apple によって設定された割り当てと上限が適用されます。

    カスタム構成証明プロバイダを使用することもできますが、これは高度なユースケースです。詳細については、Firebase App Check のドキュメントをご覧ください。

  • アプリの起動時にレイテンシが発生します。ただし、その後は定期的な再構成証明がバックグラウンドで行われるため、ユーザーはレイテンシを感じなくなります。起動時のレイテンシの正確な値は、選択した構成証明プロバイダによって異なります。

    再構成証明の頻度は、App Check トークンが有効な期間(有効期間、TTL)によって決まります。この期間は Firebase コンソールで設定できます。再構成証明は、TTL の約半分が経過したときに行われます。詳細については、証明書プロバイダの Firebase のドキュメントをご覧ください。

アプリを App Check と統合する

前提条件と要件

  • Places SDK バージョン 9.2 以降がインストールされたアプリ。
  • アプリのバンドル ID
  • Apple メンバー センターの [メンバーシップ] で確認できるチーム ID。
  • デバイス確認を使用する場合は、秘密鍵ファイル鍵 ID
  • Cloud コンソールでアプリの所有者である必要があります。
  • Cloud コンソールからアプリのプロジェクト ID を取得する必要があります。

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

Firebase デベロッパー ドキュメントの手順に沿って、Firebase をアプリに追加します。

アプリを登録すると、構成ファイル GoogleService-Info.plist が生成されます。このファイルを変更せずに、アプリのルートレベルに追加します。

Swift

import FirebaseCore
import FirebaseAppCheck
import GooglePlaces

Objective-C

@import FirebaseCore;      
@import FirebaseAppCheck;
@import GooglePlaces;

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

Firebase には、デフォルトの構成証明プロバイダごとに手順が用意されています。ここでは、Firebase プロジェクトを設定し、App Check ライブラリをアプリに追加する方法について説明します。提供されているコードサンプルに沿って、App Check を初期化します。

  1. Firebase の手順に沿って App Check ライブラリを追加します。
  2. App Check を初期化します。
    • App Attest を使用している場合は、App Attest に関する Firebase デベロッパー向けドキュメントをご覧ください。

      Firebase App Check の手順に沿って AppCheckProviderFactory の実装を作成し、AppDelegate ファイルに追加します。

      Swift

      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)

      Objective-C

      YourAppCheckProviderFactory *providerFactory =
          [[YourAppCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
         
    • デバイス確認を使用している場合は、AppDelegate に次のコードを追加します。

      Swift

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Objective-C

      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
            

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

アプリのルートレベルに AppCheckTokenProvider という名前のファイルを作成します(Objective-C を使用している場合は、AppCheckTokenProvider.hAppCheckTokenProvider.m という 2 つのファイルを作成します)。次のインポート ステートメントとクラス定義を追加します。

Swift

// AppCheckTokenProvider.swift

import FirebaseAppCheck
import Foundation
import GooglePlaces

class AppCheckTokenProvider: NSObject, GMSPlacesAppCheckTokenProvider {
  func fetchAppCheckToken() async throws -> String {
    return try await AppCheck.appCheck().token(forcingRefresh: false).token
  }
}

Objective-C

// AppCheckTokenProvider.h

@import Foundation;
@import GooglePlaces;

@interface AppCheckTokenProvider : NSObject <GMSPlacesAppCheckTokenProvider>
@end

// AppCheckTokenProvider.m

#import "AppCheckTokenProvider.h"

@import FirebaseAppCheck;

@implementation AppCheckTokenProvider

- (void)fetchAppCheckTokenWithCompletion:(nonnull GMSAppCheckTokenCompletion)completion {
  [[FIRAppCheck appCheck]
      tokenForcingRefresh:NO
               completion:^(FIRAppCheckToken *_Nullable token, NSError *_Nullable error) {
                 if (token) {
                   completion(token.token, nil);
                 } else {
                   completion(nil, error);
                 }
               }];
}

@end

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

  1. AppDelegate ファイルで、Places API を初期化します。

    Swift

    GMSPlacesClient.provideAPIKey("YOUR_API_KEY")

    Objective-C

    [GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
  2. 次に、App Check API を初期化します。

    Swift

    GMSPlacesClient.setAppCheckTokenProvider(AppCheckTokenProvider())

    Objective-C

    [GMSPlacesClient setAppCheckTokenProvider:[[AppCheckTokenProvider alloc] init]];

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

アプリをローカルで開発してテストする場合や、継続的インテグレーション(CI)環境で実行する場合は、デバッグシークレットを使用して有効な App Check トークンを取得するアプリのデバッグビルドを作成できます。これにより、デバッグビルドで実際の構成証明プロバイダを使用する必要がなくなります。

シミュレータまたはテストデバイスでアプリをテストするには:

  • App Check デバッグ プロバイダのファクトリを作成して設定します。

    このコードサンプルは、デバッグと本番環境の両方のシナリオを処理します。

    Swift

    #if targetEnvironment(simulator)
          let providerFactory = AppCheckDebugProviderFactory()
    #else
          let providerFactory = YourAppCheckProviderFactory()
    #endif

    Objective-C

    if (targetEnvironment == simulator){
    
    FIRAppCheckDebugProviderFactory *providerFactory =
          [[FIRAppCheckDebugProviderFactory alloc] init];
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
    }
    
    else {
    
    YourAppCheckProviderFactory *providerFactory =
          [[YourAppCheckProviderFactory alloc] init];
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
    }
        
  • Xcode プロジェクトでロギングを有効にしてアプリを起動し、ログでローカル デバッグ トークンを見つけます。
  • このトークンを Firebase コンソールに追加します。
  • 詳細と手順については、App Check のドキュメントをご覧ください。

CI 環境でアプリを実行するには:

  • Firebase コンソールでデバッグ トークンを作成し、CI システムの安全なキーストアに追加します。
  • Xcode で、FIRAAppCheckDebugToken という名前のテストスキームと $(APP_CHECK_DEBUG_TOKEN) などに環境変数を値として追加します。
  • CI テスト スクリプトで、デバッグ トークンを環境として渡す
  • App Check デバッグ プロバイダのファクトリを作成して設定します。

    このコードサンプルは、デバッグと本番環境の両方のシナリオを処理します。

    Swift

      #if targetEnvironment(ci)
            let providerFactory = AppCheckDebugProviderFactory()
            AppCheck.setAppCheckProviderFactory(providerFactory)
      #else
            let providerFactory = YourAppCheckProviderFactory()
      #endif
      

    Objective-C

    if (targetEnvironment == ci) {
    FIRAppCheckDebugProviderFactory *providerFactory =
          [[FIRAppCheckDebugProviderFactory alloc] init];
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
    }
    
    else {
    YourAppCheckProviderFactory *providerFactory =
          [[YourAppCheckProviderFactory alloc] init];
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
    }
  • 詳細と手順については、App Check のドキュメントをご覧ください。

ステップ 6: アプリのリクエストをモニタリングして適用を決定する

適用を開始する前に、アプリの正規ユーザーに支障をきたさないようにする必要があります。そのためには、App Check 指標画面で、アプリのトラフィックのどの程度が確認済み、古い、または不正であるかを確認します。トラフィックの大部分が確認されたら、適用を有効にできます。

詳細と手順については、Firebase App Check のドキュメントをご覧ください。