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

Firebase App Check は、正規のアプリ以外のソースから発信されたトラフィックをブロックすることで、アプリから Google Maps Platform への呼び出しを保護します。これは、reCAPTCHA Enterprise などの証明書プロバイダからのトークンを確認することで行われます。アプリを 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 と統合する手順は次のとおりです。

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

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

  • おすすめする証明書プロバイダの 1 つである reCAPTCHA Enterprise では、1 か月あたり 10,000 件を超える評価に対して料金が発生します。

    Google が推奨するもう 1 つの証明書プロバイダである reCAPTCHA v3 には割り当てがあり、割り当てを超えるとトラフィックは評価されません。

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

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

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

アプリを App Check と統合する

前提条件と要件

  • Maps JS API の最新の週次または四半期ごとのバージョン、Core ライブラリ、Places ライブラリが読み込まれたアプリ。
  • Maps JS API と Places API(新版)が有効になっている Cloud プロジェクト。
  • Cloud Console でアプリのオーナーである必要があります。
  • Cloud Console からアプリのプロジェクト ID を取得する必要があります。

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

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

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

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

ステップ 3: Maps JS API ライブラリを読み込む

  1. 次のスニペットに示すように、Core、Maps、Places の各ライブラリを読み込みます。詳細と手順については、Maps JavaScript API Place クラスのドキュメントをご覧ください。

    async function init() {
      const {Settings} = await google.maps.importLibrary('core');
      const {Map} = await google.maps.importLibrary('maps');
      const {Place} = await google.maps.importLibrary('places');
    }  

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

  1. Firebase コンソールから提供された構成を使用して App Check を初期化します。
  2. Maps JS API へのリクエストに App Check トークンが伴っていることを確認します。
      async function init() {
        const {Settings} = await google.maps.importLibrary('core');
        const {Map} = await google.maps.importLibrary('maps');
        const {Place} = await google.maps.importLibrary('places');
      
        const app = initializeApp({
          // Your firebase configuration object
        });
      
        // Pass your reCAPTCHA Enterprise site key to initializeAppCheck().
        const appCheck = initializeAppCheck(app, {
          provider: new ReCaptchaEnterpriseProvider(
            'abcdefghijklmnopqrstuvwxy-1234567890abcd',
          ),
      
          // Optional argument. If true, the SDK automatically refreshes App Check
          // tokens as needed.
          isTokenAutoRefreshEnabled: true,
        });
      
        Settings.getInstance().fetchAppCheckToken = () =>
            getToken(appCheck, /* forceRefresh = */ false);
      
        // Make a Places JS request
        const place = new Place({id: 'ChIJN5Nz71W3j4ARhx5bwpTQEGg'});
        await place.fetchFields({fields: ['*']});
      
        // Load a map
        map = new Map(document.getElementById("map"), {
          center: { lat: 37.4161493, lng: -122.0812166 },
          zoom: 8,
        });
      }  
      

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

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

アプリをローカルでテストするには:

  • 開発用にデバッグ プロバイダを有効にします。
  • SDK のデバッグログから、自動生成されたランダムな UUID4(App Check のドキュメントではデバッグ トークンと呼ばれます)が返されます。このトークンを Firebase コンソールに追加します。
  • 詳細と手順については、App Check のドキュメントをご覧ください。

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

  • Firebase コンソールからランダムな UUID4 を生成します。
  • UUID4 をデバッグ トークンとして追加し、テスト実行ごとに CI テストがアクセスするシークレット ストアにコピーします。
  • 詳細と手順については、App Check のドキュメントをご覧ください。

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

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

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