2020.4.13

Cloud FunctionsからFirestoreのデータを操作するのにセキュリティルールの設定は不要

Cloud Functionsに作成した関数からFirestoreのデータを操作(登録、削除など)するのに、セキュリティルールの設定をどうすればいいのかと思っていたら、そもそも設定自体が必要なかったのでメモとして残しておきます。

目次

  • Cloud FunctionsからFirestore操作
  • Firestoreのセキュリティルール
  • 補足

Cloud FunctionsからFirestore操作

Cloud Functionsの関数からFirestoreのデータを操作する簡単なコード例は以下の通り。


const functions = require('firebase-functions');
const admin = require("firebase-admin");
admin.initializeApp();
const fireStore = admin.firestore();

exports.saveProduct = functions
  .https.onRequest((req, res) => {

  fireStore.collection("products").add({
      name: "product name",
      price: 19800
  }).then(function(docRef) {
      res.send("success")
  }).catch(function (err) {
      console.error("Error saving product:", err);
      return res.status(500).end();
  });
});

参考になりそうな記事を検索すると、admin.initializeApp() に引数(credential)を指定している場合がありますが、指定しなかった場合はプロジェクトの環境変数が自動的に設定されるようです。

環境の構成  |  Firebase

Firestoreのセキュリティルール

登録処理をCloud Functionsの関数でのみ行う場合、Firestore側でのセキュリティルール設定は不要なので、読み込みのみWebサイトなどから誰でも公開アクセス可能とするなら、以下のようなルールになります。


rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read: if true
    }
  }
}

ルールのデフォルトは「false」なので、外部からのアクセスで、上記のルールに記述した以外の操作はエラーになります。

補足

Firestoreのセキュリティルールで特定のWebサイト(ドメイン)からのみアクセスを許可したかったのですが、その方法が見つからなかったので、やるならFunctionsでCORSに対応した関数を用意して、そちらから呼び出すような形になるのだと思います。

Firebase】関連記事