如何保护Firebase Cloud Function REST API?仅允许指定ERP访问
解决方案与疑问解答
一、实现API访问控制(令牌认证+仅POST请求)
1. 限制仅POST请求
在Cloud Functions中直接校验请求方法,非POST请求直接返回405状态码:
exports.writeToTest = functions.https.onRequest((req, res) => { // 校验请求方法 if (req.method !== 'POST') { return res.status(405).send('Method Not Allowed'); } // 后续写入RTDB的逻辑 });
2. 专属令牌认证
采用自定义API密钥的方式,步骤如下:
- 先在Firebase项目中设置环境变量存储令牌:
firebase functions:config:set erp.api_key="your-secure-secret-token" - 在函数中校验请求头携带的令牌,与环境变量中的值对比:
exports.writeToTest = functions.https.onRequest((req, res) => { // 先校验请求方法 if (req.method !== 'POST') { return res.status(405).send('Method Not Allowed'); } // 校验专属令牌 const requestKey = req.headers['x-erp-api-key']; const validKey = functions.config().erp.api_key; if (!requestKey || requestKey !== validKey) { return res.status(403).send('Unauthorized'); } // 执行写入RTDB逻辑 admin.database().ref('Test').push(req.body) .then(() => res.status(200).send('Data written successfully')) .catch(err => res.status(500).send(`Error: ${err.message}`)); });
注意:不要把令牌硬编码在代码里,用环境变量存储避免泄露。
二、疑问解答
1. 服务账号的private_key和private_key_id能否用于ERP认证?
不建议这么做。服务账号拥有Firebase项目的全权限,一旦private_key泄露,整个项目的数据和配置都会面临风险。更安全的方式是使用自定义API密钥,或者为ERP创建一个仅拥有RTDB Test节点写入权限的受限服务账号(即使如此,也不要直接将private_key交付给ERP方,优先用短期令牌方案)。
2. Firebase实时规则是否适用于此场景?
你的判断正确——Firebase实时规则对Admin SDK完全无效。Admin SDK是绕过规则直接操作数据库的,所以实时规则无法限制你通过Cloud Functions中Admin SDK执行的写入操作,必须在Cloud Functions层面做访问控制。
内容的提问来源于stack exchange,提问作者David L
相关产品推荐
相关产品推荐

