如何限制Cloud Run仅接受Firebase Hosting访问及认证计费疑问
问题解答
一、限制Cloud Run仅接受Firebase Hosting的访问
有两种可靠的实现方式,按安全性优先级排序:
1. 通过IAM策略限制调用者
Firebase Hosting在转发请求到Cloud Run时,会使用固定的Google服务账号发起请求。你可以通过配置Cloud Run的IAM权限,仅允许该服务账号调用:
- 找到你的Firebase Hosting对应的服务账号,格式为
service-<你的项目编号>@gcf-admin-robot.iam.gserviceaccount.com(项目编号可在Google Cloud控制台的项目设置中查看) - 进入Cloud Run控制台,找到你的服务,切换到「权限」标签
- 移除默认的「allUsers」权限(如果存在)
- 添加新权限:选择「添加主账号」,输入上述服务账号,分配「Cloud Run 调用者(roles/run.invoker)」角色
这种方式由Google基础设施层面做认证,完全避免了伪造请求的可能,是最安全的方案。
2. 验证请求头(辅助补充)
Firebase Hosting转发请求时会自动添加 X-Firebase-Hosting-Source 请求头,值为你的Firebase项目ID。你可以在FastAPI后端添加中间件,检查该头的存在和正确性:
from fastapi import FastAPI, Request, HTTPException app = FastAPI() @app.middleware("http") async def verify_firebase_hosting(request: Request, call_next): source_header = request.headers.get("X-Firebase-Hosting-Source") if not source_header or source_header != "你的项目ID": raise HTTPException(status_code=403, detail="Invalid request source") response = await call_next(request) return response
注意:这种方式仅作为辅助,因为请求头存在被伪造的可能,建议和IAM策略结合使用。
二、关于认证流程与计费的疑问
你的认证流程逻辑是对的,但计费部分的理解有误:
- 如果是在FastAPI后端自行验证idToken,那么无论token是否有效,请求已经到达你的容器实例,都会产生计费。只有当请求被Cloud Run的基础设施层拦截(比如IAM策略拒绝)时,才不会计费。
正确的优化方案(兼顾安全与计费)
让Cloud Run直接验证Firebase Auth的idToken,而非后端自行处理:
- 前端通过Firebase Authentication完成用户认证,获取idToken
- 请求Cloud Run API时,将idToken放在
Authorization: Bearer <idToken>请求头中 - 配置Cloud Run的IAM策略,允许经过Firebase Auth认证的用户访问:
- 进入Cloud Run控制台的权限设置,添加主账号:
principals://iam.googleapis.com/projects/<你的项目ID>/locations/global/workloadIdentityPools/firebase.local/identityProviders/firebase - 为该主账号分配「Cloud Run 调用者(roles/run.invoker)」角色
- 进入Cloud Run控制台的权限设置,添加主账号:
这样,无效的idToken请求会被Cloud Run基础设施直接拒绝,不会到达你的容器,也就不会产生计费;只有验证通过的请求才会进入后端处理并计费,完全符合你期望的计费逻辑。
内容的提问来源于stack exchange,提问作者CSSer
相关产品推荐
相关产品推荐

