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

Firebase云函数访问Firestore遇7 PERMISSION_DENIED权限错误求助

解决Firebase Cloud Function访问Firestore的PERMISSION_DENIED错误

1. 修复Admin SDK初始化错误

你的admin.js中初始化Admin SDK的方式不正确,直接传入serviceAccount对象会导致SDK无法正确加载权限配置,这是引发权限错误的核心原因。

正确代码:

const admin = require("firebase-admin")
const serviceAccount = require("./serviceAccountKey.json")

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
})

module.exports = admin

2. 改用Admin SDK操作Firestore

你在firebase.js中同时使用了客户端SDK和Admin SDK,客户端SDK会受Firestore安全规则限制,而Cloud Function中应该直接使用Admin SDK的Firestore实例(绕过安全规则,使用IAM权限)。

修改firebase.js中的Firestore实例及操作代码:

// 移除客户端SDK的Firestore初始化,替换为Admin SDK实例
const db = admin.firestore()

// 调整handleGoogleSignIn中的操作逻辑:
const handleGoogleSignIn = async (req, res) => {
  const { idToken } = req.body

  try {
    const decodedToken = await admin.auth().verifyIdToken(idToken)
    const uid = decodedToken.uid
    const email = decodedToken.email

    const userDocRef = db.doc(`users/${uid}`)
    const docSnapshot = await userDocRef.get()

    if (!docSnapshot.exists) {
      await userDocRef.set({
        email: email,
        createdAt: new Date(),
        userData: {},
      })
    }

    const updatedDocSnapshot = await userDocRef.get()

    if (!updatedDocSnapshot.exists) {
      throw new Error("User document not found")
    }

    const customToken = await admin.auth().createCustomToken(uid)

    const userData = {
      uid: uid,
      email: email,
      ...updatedDocSnapshot.data(),
    }

    res.status(200).json({
      message: "Google sign-in successful",
      user: userData,
      idToken: customToken,
      success: true,
    })
  } catch (error) {
    console.error("Google sign-in error:", error.message)
    res.status(500).send({ error: "Google sign-in failed. Please try again." })
  }
}

3. 解决Cloud Functions权限无法修改的问题

Cloud Functions页面提示权限继承自其他资源,说明权限是在项目级IAM配置中设置的。要添加角色:

  • 进入IAM & Admin > IAM页面
  • 找到对应的Cloud Functions服务账号(格式通常为[你的项目ID]@appspot.gserviceaccount.com)
  • 直接为该账号添加所需角色,无需在Cloud Functions页面操作

你的服务账号已拥有Editor、Firebase Admin等足够访问Firestore的权限,修复SDK初始化后即可正常使用。

4. Database Secrets提示与当前问题无关

该提示仅说明旧版Database Secrets已废弃,建议使用Admin SDK,和你当前的权限错误没有直接关联,修复Admin SDK初始化后可忽略此提示。

验证步骤

  1. 确认serviceAccountKey.json是从Firebase控制台下载的有效项目服务账号密钥
  2. 部署修复后的Cloud Function
  3. 查看函数日志,确认权限错误是否消失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:32:11