首页 > 解决方案 > Firestore 拒绝在具有完全开放安全规则的 Web Worker 中添加操作(Web 应用程序)

问题描述

因此,我设置了以下 Web Worker 以将数据添加到 Firestore 集合。

Web Worker 代码的第一部分初始化 Firebase 并获取一些引用

importScripts("https://www.gstatic.com/firebasejs/8.3.1/firebase-app.js");
importScripts("https://www.gstatic.com/firebasejs/8.3.1/firebase-auth.js");
importScripts("https://www.gstatic.com/firebasejs/8.3.1/firebase-firestore.js");

// firebase configuration object
const firebaseConfig = {
  apiKey: "XXX",
  authDomain: "XXX",
  projectId: "XXX",
  storageBucket: "XXX",
  messagingSenderId: "XXX",
  appId: "XXX"
};
// initialize firebase
firebase.initializeApp(firebaseConfig);
// get reference to db
const db = firebase.firestore();
// get reference to collection
const collection = db.collection("data");

以下函数在网络工作者内部执行实际上传(至少在我的意图中)

// function to handle document upload to firestore
const uploadData = async document => {
  // try to
  try {
    // sign in anonymously to firebase
    await firebase.auth().signInAnonymously();
    // upload document
    const docRef = await collection.add(document);
    // output docRef to console
    console.log(docRef);
    // signout
    firebase.auth().signout();
  }
  // on error
  catch(error) {
    // output error to console
    const errorCode = error.code;
    const errorMessage = error.message;
    console.log(error, errorCode, errorMessage);
  };
};

最后,这是启动 web worker 的事件监听器:

// event handler
onmessage = async function(e) {
  // cache data
  const workerData = e.data;
  // upload data to firestore
  await uploadData(workerData);
  // send upload finished
  postMessage("upload finished");
};

Firestore 规则是完全开放的(仅用于测试目的):

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

尽管如此,当我的网络工作者运行时,我在控制台中收到以下错误:

"permission-denied" "Missing or insufficient permissions"

我做错了什么?

标签: firebasegoogle-cloud-firestoreweb-worker

解决方案


出于某种奇怪的原因,在当前的 firebase 项目中,配置对象缺少道具“databaseURL”。我删除了项目,创建了一个新项目,代码按预期工作。事实上,新的 firebase 配置对象正确设置了“databaseURL”属性。


推荐阅读