You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Firebase Admin SDK读取Firestore文档时staging环境权限错误

Firebase Functions(Staging环境)使用Admin SDK读取Firestore报权限拒绝排查方案

问题描述

使用TypeScript+Express开发Firebase Functions应用,通过Firebase Admin SDK读取Firestore文档,本地开发环境可正常运行,但部署到staging环境时抛出权限拒绝错误:

Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.
    at Object.callErrorFromStatus (/layers/google.nodejs.yarn/yarn_modules/node_modules/@grpc/grpc-js/build/src/call.js:31:19)
    at Object.onReceiveStatus (/layers/google.nodejs.yarn/yarn_modules/node_modules/@grpc/grpc-js/build/src/client.js:352:49)
    at Object.onReceiveStatus (/layers/google.nodejs.yarn/yarn_modules/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:328:181)
    at /layers/google.nodejs.yarn/yarn_modules/node_modules/@grpc/grpc-js/build/src/call-stream.js:188:78
    at processTicksAndRejections (node:internal/process/task_queues:78:11)

已排查内容:Firestore规则、Admin SDK初始化状态、环境变量(FB_PROJECT_ID/FB_PRIVATE_KEY/FB_CLIENT_EMAIL)配置、目标文档存在性,均未发现异常。核心代码如下:

import * as cors from "cors";
import * as bodyParser from "body-parser";
import * as express from "express";
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

const app = express();

app.use(cors());
app.use(bodyParser.json());

app.set("fbProjectId", process.env.FB_PROJECT_ID ?? "");
app.set("fbPrivateKey", process.env.FB_PRIVATE_KEY ?? "");
app.set("fbClientEmail", process.env.FB_CLIENT_EMAIL);
if (admin.apps.length === 0) {
  admin.initializeApp();
}
export const db = admin.firestore();

app.get("/objects/:id", async (req, res) => {
  const id = req.params.id;
  const object = await db.collection("objects").doc(id).get().then((doc) => {
    return doc.data();
  })
  res.status(200).send(object)
  return
});

可能的原因及解决方案

1. Admin SDK初始化未传入服务账号配置

代码中仅将环境变量存入Express的app设置,但初始化Admin SDK时未传入这些配置。本地开发时Firebase CLI会自动加载本地凭据,可正常运行;但staging环境下,默认的Functions服务账号可能没有足够的Firestore权限。

解决方法:初始化时显式传入服务账号配置,同时处理私钥的换行符转义问题:

if (admin.apps.length === 0) {
  admin.initializeApp({
    credential: admin.credential.cert({
      projectId: process.env.FB_PROJECT_ID,
      privateKey: process.env.FB_PRIVATE_KEY?.replace(/\\n/g, '\n'),
      clientEmail: process.env.FB_CLIENT_EMAIL
    })
  });
}

2. Staging环境Functions服务账号权限不足

即使使用了正确的服务账号,该账号可能未被赋予Firestore读写权限。

解决步骤:

  • 进入Firebase控制台 项目设置 > 服务账号,找到staging环境的Functions服务账号(格式通常为[项目ID]@appspot.gserviceaccount.com)
  • 打开Google Cloud IAM控制台,找到该账号,添加Cloud Datastore User或Firebase Admin SDK Administrator Service Agent角色,确保拥有Firestore读写权限

3. Staging环境环境变量配置隐性错误

需确认以下细节:

  • FB_PRIVATE_KEY是否完整:必须包含-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----,且换行符处理正确
  • 环境变量名称是否匹配:检查staging环境的变量名是否为FB_PROJECT_ID/FB_PRIVATE_KEY/FB_CLIENT_EMAIL,无拼写错误
  • 环境变量是否生效:通过firebase functions:config:set配置后需重新部署,或确认Google Cloud控制台的Functions配置中已正确添加变量

4. Firestore规则的特殊限制

Admin SDK默认绕过Firestore规则,但如果初始化时强制启用了规则检查(极少情况),需确认规则未限制服务账号访问。可临时将规则设为开放(仅用于排查):

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

排查完成后需恢复原有规则。

内容的提问来源于stack exchange,提问作者kokucoco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:52:21