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

如何限制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,而非后端自行处理:

  1. 前端通过Firebase Authentication完成用户认证,获取idToken
  2. 请求Cloud Run API时,将idToken放在 Authorization: Bearer <idToken> 请求头中
  3. 配置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)」角色

这样,无效的idToken请求会被Cloud Run基础设施直接拒绝,不会到达你的容器,也就不会产生计费;只有验证通过的请求才会进入后端处理并计费,完全符合你期望的计费逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:20:31