Firebase apiKey ってさらしていいの? ほんとに?


界隈でちょくちょく質問されているのを見るので調べたことをまとめてみました。
結論だけで言うと、「よい」です。

Firebase apiKey? なに?

Firebase project を作成すると projectId はもちろん apiKey や databaseURL などが作成され、これを使うことで機能が使えるようになります。Firebase console でいうと Project 設定などから [アプリを追加] すると取得できます。

詳しい手順はこちら。https://support.google.com/firebase/answer/7015592?authuser=0

(値は仮です)
  var config = {
    apiKey: "CcN0p0MAIzavPCNkmXSyAy4xhKwCF6CqbX5TcvL",
    authDomain: "example.firebaseapp.com",
    databaseURL: "https://example.firebaseio.com",
    projectId: "example",
    storageBucket: "example.appspot.com",
    messagingSenderId: "032531346579"
  };
  firebase.initializeApp(config);

"apiKey" っていう名前がよくないと思うのですが、(Firebase らしく) client に含めて使う == エンドユーザーの手元に直接届く/保存される、すなわち public 情報である前提のものです。

実は ...?

この設定値、そもそも Firebase Hosting を有効にすると、自動で そのサイトから /__/firebase/init.js という path で参照できるようになります。Hosting を Authentication などとあわせて使うときのために、最初から置いてくれているわけです。気が利いてますね。このあたりは使い方が以下にドキュメントされています。

<!-- load Firebase SDK before loading this file -->
<script src="/__/firebase/init.js"></script>

こういうところから見ても、公開前提の値であり隠すようなものではないということがわかります。
というかこんな便利なことはもっと宣伝してほしい。
(angular/fire でこれを使ってうまく初期化する方法は模索中)

よかった ... のだね?

はい。ただし、一部気をつけることがあります。

Firestore

この設定値がわかると、その project の Firestore にかんたんにアクセスできます。Firestore の設定が test mode になっていて rule があまくなっていると、データを抜かれたり荒らされたりするかもしれません。

たとえば。当初ある project では Firestore のみ Admin API からだけ利用するつもりでいたので Firestore の rule はあまり気にしていなかったが、リリース直前になって簡単なサイトが必要になったので Hosting を有効にしたら config が公開されて... というシナリオが考えられます。

もともとはじぶんで疑問に思って web にあたってみたのですが、このあたりが参考になりました。
https://stackoverflow.com/questions/37482366/is-it-safe-to-expose-firebase-apikey-to-the-public

たしかに、Firebase project で billing が有効になっていると利用料を増やす嫌がらせとかはできそうですね。ただそれはサイトの利用を単に増やすだけ (なつかしの F5 アタック的な) でもできるので、特有の事情とは言えないかも。

そして? 他にもあるかも?

危険はあらゆる場所に潜んでいる。何かあったら教えてください。

更新 20200105 : console で config の取得方法が変わっていたので更新しました。