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 と統合する手順は次のとおりです。
- Firebase をアプリに追加します。
- App Check ライブラリを追加して初期化します。
- トークン プロバイダをアプリに追加します。
- Places API と App Check API を初期化します。
- デバッグを有効にします。
- アプリのリクエストをモニタリングし、適用を決定します。
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 Member Center の [Membership] にあるチーム ID。
- Device Check を使用する場合は、秘密鍵ファイルと鍵 ID。
- Cloud Console でアプリの所有者である必要があります。
- Cloud Console からアプリのプロジェクト ID を取得する必要があります。
ステップ 1: Firebase をアプリに追加する
Firebase デベロッパー ドキュメントの手順に沿って、アプリに Firebase を追加します。
アプリを登録すると、構成ファイル GoogleService-Info.plist
が取得されます。このファイルを変更せずにアプリのルートレベルに追加します。
Places Swift SDK for iOS
import FirebaseCore import FirebaseAppCheck import GooglePlacesSwift
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 を初期化してください。
- Firebase の手順に沿って App Check ライブラリを追加します。
- App Attest の手順をご覧ください。
- デバイス チェックの手順。
- App Check を初期化します。
- App Attest を使用している場合は、App Attest に関する Firebase デベロッパー ドキュメントをご覧ください。
Firebase App Check の手順に沿って、
AppCheckProviderFactory
の実装を作成し、AppDelegate
ファイルに追加します。Places Swift SDK for iOS
let providerFactory = YourAppCheckProviderFactory() AppCheck.setAppCheckProviderFactory(providerFactory)
Swift
let providerFactory = YourAppCheckProviderFactory() AppCheck.setAppCheckProviderFactory(providerFactory)
Objective-C
YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init]; [FIRAppCheck setAppCheckProviderFactory:providerFactory];
- Device Check を使用している場合は、
AppDelegate
に次のものを追加します。Places Swift SDK for iOS
AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())
Swift
AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())
Objective-C
[FIRAppCheck setAppCheckProviderFactory:providerFactory];
- App Attest を使用している場合は、App Attest に関する Firebase デベロッパー ドキュメントをご覧ください。
ステップ 3: トークン プロバイダを追加する
アプリのルートレベルに AppCheckTokenProvider
というファイル(Objective-C を使用している場合は AppCheckTokenProvider.h
と AppCheckTokenProvider.m
という 2 つのファイル)を作成します。
次のインポート ステートメントとクラス定義を追加します。
Places Swift SDK for iOS
// AppCheckTokenProvider.swift import FirebaseAppCheck import Foundation import GooglePlacesSwift struct TokenProvider: AppCheckTokenProvider { func fetchAppCheckToken() async throws -> String { return try await AppCheck.appCheck().token(forcingRefresh: false).token } }
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 を初期化する
AppDelegate
ファイルで、Places API を初期化します。Places Swift SDK for iOS
PlacesClient.provideAPIKey("YOUR_API_KEY")
Swift
GMSPlacesClient.provideAPIKey("YOUR_API_KEY")
Objective-C
[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
- 次に、App Check API を初期化します。
Places Swift SDK for iOS
PlacesClient.setAppCheckTokenProvider(AppCheckTokenProvider())
Swift
GMSPlacesClient.setAppCheckTokenProvider(AppCheckTokenProvider())
Objective-C
[GMSPlacesClient setAppCheckTokenProvider:[[AppCheckTokenProvider alloc] init]];
ステップ 5: デバッグを有効にする(省略可)
アプリをローカルで開発してテストする場合や、継続的インテグレーション(CI)環境で実行する場合は、デバッグ シークレットを使用して有効な App Check トークンを取得するアプリのデバッグビルドを作成できます。これにより、デバッグビルドで実際のアテステーション プロバイダを使用することを回避できます。
シミュレータまたはテストデバイスでアプリをテストするには:
App Check デバッグ プロバイダのファクトリを作成して設定します。
このコードサンプルは、デバッグ シナリオと本番環境シナリオの両方を処理します。Places Swift SDK for iOS
#if targetEnvironment(simulator) let providerFactory = AppCheckDebugProviderFactory() #else let providerFactory = YourAppCheckProviderFactory() #endif
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 デバッグ プロバイダのファクトリを作成して設定します。
このコードサンプルは、デバッグ シナリオと本番環境シナリオの両方を処理します。Places Swift SDK for iOS
#if DEBUG let providerFactory = AppCheckDebugProviderFactory() #else let providerFactory = YourAppCheckProviderFactory() #endif AppCheck.setAppCheckProviderFactory(providerFactory)
Swift
#if DEBUG let providerFactory = AppCheckDebugProviderFactory() #else let providerFactory = YourAppCheckProviderFactory() #endif AppCheck.setAppCheckProviderFactory(providerFactory)
Objective-C
#if DEBUG id<FIRAppCheckProviderFactory> providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init]; #else // DEBUG id<FIRAppCheckProviderFactory> providerFactory = [[YourAppCheckProviderFactory alloc] init]; #endif // DEBUG AppCheck.setAppCheckProviderFactory(providerFactory)
- 詳細と手順については、App Check のドキュメントをご覧ください。
ステップ 6: アプリのリクエストをモニタリングし、強制措置を決定する
適用を開始する前に、アプリの正規ユーザーを中断しないように対策を行う必要があります。そのためには、App Check の指標画面で、アプリのトラフィックのうち、確認済み、古い、不正なトラフィックの割合を確認します。トラフィックの大部分が確認されたら、適用を有効にできます。
詳細と手順については、Firebase App Check のドキュメントをご覧ください。