Firebase 通过函数写入 Firestore 时出错:“7 PERMISSION_DENIED:缺少或权限不足”

2024-04-18

我正在尝试编写一个简单的 Firebase 函数,使用 TypeScript 将记录添加到 Firestore。代码的精简版本是:

import * as admin from "firebase-admin";
import * as functions from "firebase-functions";

const config = functions.config();

admin.initializeApp(functions.config().firebase);
admin.database.enableLogging(true);

exports.subscriptions = functions.https.onRequest(
  async (req, res) => {
    try {
      const requestSubscription = req.body;
      const subscription = {
        subscription_id: requestSubscription.subscription_id,
        email: requestSubscription.email || ""
      };

      const id = subscription.subscription_id;
      const dbSubscriptions = admin.firestore().collection("subscriptions");
      await dbSubscriptions.doc(id).set(subscription);

      return res.status(200).send(`Success`);
    } catch (e) {
      console.error(e.stack);
      return res.status(500).send(`Error`);
    }
  }
);

这在本地按预期工作。当我部署时,我收到此错误:

Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.
    at Object.exports.createStatusError (/user_code/node_modules/firebase-admin/node_modules/grpc/src/common.js:87:15)
    at Object.onReceiveStatus (/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:1214:28)
    at InterceptingListener._callNext (/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:590:42)
    at InterceptingListener.onReceiveStatus (/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:640:8)
    at callback (/user_code/node_modules/firebase-admin/node_modules/grpc/src/client_interceptors.js:867:24)

我的functions/package.json 文件是:

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    "express": "4.16.3",
    "firebase-admin": "5.12.1",
    "firebase-functions": "1.0.3"
  },
  "devDependencies": {
    "tslint": "^5.8.0",
    "typescript": "^2.5.3"
  },
  "private": true
}

我搜索此错误的唯一链接是这个未回答的问题:PERMISSION_DENIED Firestore CloudFunction TypeScript https://stackoverflow.com/questions/49910274/permission-denied-firestore-cloudfunction-typescript

我已经将 Firestore 规则设置为允许任何人读取和写入,即使上面使用的是管理员,但它仍然不起作用。

有人可以帮忙吗?


我在更新 IAM/服务账户值时遇到了这个问题,我想我已经解决了。

如果您使用 Firebase Admin SDK 而不在 Firebase Functions 中提供任何凭据,如下所示firebaseAdmin.initializeApp()那么您的函数将使用默认的应用程序凭据。

默认凭据使用以下服务帐户{project-id}@appspot.gserviceaccount.com where {project-id}将是您的 firebase/google cloud 项目 ID。当您创建 Firebase 项目或使用一些谷歌云服务时,通常会自动创建此帐户。

Anyhow, {project-id}@appspot.gserviceaccount.com默认情况下有Editor级别权限。您可以在[Google Cloud - IAM & 管理员 - IAM]页面查看。我认为它的权限太多,所以我基本上从服务帐户中删除了该权限,并决定手动添加更多限制性权限。 (当时,我不知道firebase/cloud功能使用这个服务帐户。

进行这些更改后,我访问 Firestore 的函数很快就开始遇到Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.错误。 为了解决这个问题,我必须做以下两件事。

  • 添加回来Editor将权限级别恢复到默认服务帐户。
  • 使用 Firebase 控制台完全删除了 Firestore 功能,并使用重新部署它们firebase deploy --only functions命令。

完成上述 2 个步骤后,我的云功能开始按预期正常工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 通过函数写入 Firestore 时出错:“7 PERMISSION_DENIED:缺少或权限不足” 的相关文章

随机推荐