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

自定义Rest API对接Firestore Database如何阻止未授权访问读取接口数据

问题核心原因

你配置的Firestore规则没有生效,是因为部署在Firebase Functions里的后端代码如果用的是Firebase Admin SDK初始化,默认会完全绕过Firestore安全规则校验,所以不管你规则怎么写,只要API代码里直接调用Admin SDK读Firestore,请求都会成功。

可行的解决方案
  • 方案1:给API增加身份校验
    最常用的是搭配Firebase Auth做ID token校验,前端发起请求的时候在请求头里携带用户的ID token,后端接口拿到之后先校验token有效性,只有合法的、符合权限要求的用户才继续执行读库逻辑,否则直接返回403错误。
    参考代码示例:

    const functions = require("firebase-functions");
    const admin = require("firebase-admin");
    admin.initializeApp();
    
    exports.read = functions.https.onRequest(async (req, res) => {
      // 1. 从请求头提取ID token
      const idToken = req.headers.authorization?.split('Bearer ')[1];
      if (!idToken) {
        return res.status(401).send('未授权的访问');
      }
      try {
        // 2. 校验token合法性
        const decodedToken = await admin.auth().verifyIdToken(idToken);
        const uid = decodedToken.uid;
        // 可额外加权限判断,比如仅管理员可拉取全量数据
        const adminUidList = ['你的管理员uid1', '你的管理员uid2'];
        if (!adminUidList.includes(uid)) {
          return res.status(403).send('没有访问权限');
        }
        // 3. 校验通过再执行读库逻辑
        const snapshot = await admin.firestore().collection('你的目标集合名').get();
        const result = snapshot.docs.map(doc => ({id: doc.id, ...doc.data()}));
        return res.status(200).json(result);
      } catch (error) {
        return res.status(401).send('token校验失败');
      }
    });
    
  • 方案2:接口仅个人调试用的话,可新增固定访问密钥校验
    你可以在云函数环境变量里配置一个只有你知道的密钥,请求时必须在请求头/请求参数里携带这个密钥,匹配通过才允许访问。
    参考校验逻辑:

    // 部署前可通过命令 firebase functions:config:set access.secret="你自定义的密钥" 配置环境变量
    const validSecret = functions.config().access.secret;
    const requestSecret = req.headers['x-access-secret'];
    if (requestSecret !== validSecret) {
      return res.status(403).send('无权访问');
    }
    
  • 方案3:如果不需要对外暴露这个接口,仅内部逻辑调用,可以把接口的触发方式从HTTP触发改成后台事件触发,或者改用可调用云函数,就不会生成公开可直接访问的URL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:54:01