为何测试Firebase云函数时浏览器出现认证及403禁止访问问题?
问题原因及解决办法
我之前在使用Firebase Spark免费套餐部署HTTP云函数时,也碰到过完全一样的问题——跳谷歌登录后反而收到403 Forbidden,其实核心问题出在Spark套餐对云函数的默认权限限制上,具体原因和解决办法如下:
核心原因
Spark免费套餐的HTTP云函数默认采用了非常严格的访问控制:
- 只有Firebase项目的成员账号(也就是你在Firebase控制台「用户和权限」中添加的账号,比如项目所有者、编辑者等角色)才有调用权限。哪怕你用自己的谷歌账号完成了登录,但如果这个账号没被添加到项目成员列表里,依然会被拒绝访问。
- 此外,Spark套餐不允许匿名访问HTTP云函数,也限制了非Firebase官方服务发起的未授权请求,这也是为什么你登录后还是无法访问的关键。
解决办法
1. 将登录账号添加到项目成员列表
这是最直接的解决方案:
- 打开Firebase控制台,点击左上角的项目设置图标(齿轮形状)。
- 切换到「用户和权限」标签页,点击「添加成员」。
- 输入你用来登录的谷歌邮箱地址,给它分配Cloud Functions Invoker角色(这个角色仅赋予调用云函数的权限,避免过度授权)。
- 保存配置后重新访问云函数URL,应该就能正常访问了。
2. 开放权限给所有用户(谨慎操作)
如果你希望让非项目成员的普通用户也能访问云函数,可以调整IAM权限:
- 打开与Firebase项目绑定的谷歌云控制台,找到「Cloud Functions」服务。
- 选中你的
foo函数,切换到「权限」标签页,点击「添加主账号」。 - 在「新主账号」输入框中填写
allUsers,然后选择「Cloud Functions Invoker」角色并保存。
⚠️ 注意:此设置会让任何人都能访问你的云函数,存在安全风险,而且Spark套餐有每月免费调用次数限制,要警惕恶意刷量的情况。
3. 通过Firebase Auth验证合法用户
如果你的应用本身使用Firebase Authentication,推荐用这种方式来控制访问:
在云函数中添加ID Token校验逻辑,确保只有通过你的应用登录的用户才能访问:
import * as admin from 'firebase-admin'; admin.initializeApp(); export const foo = functions.https.onRequest(async (req, res) => { // 从请求头提取ID Token const idToken = req.headers.authorization?.split('Bearer ')[1]; if (!idToken) { return res.status(401).send('Unauthorized'); } try { // 验证Token合法性 const decodedToken = await admin.auth().verifyIdToken(idToken); // 验证通过后执行你的业务逻辑 res.send('Request processed successfully'); } catch (error) { res.status(403).send('Forbidden: Invalid token'); } });
前端请求时,需要先获取当前登录用户的ID Token,然后将其放在请求头的Authorization字段中,格式为Bearer <你的ID Token>。
内容的提问来源于stack exchange,提问作者Eliot
相关产品推荐
相关产品推荐

