自定义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
相关产品推荐
相关产品推荐

