Web应用的签名URL端点是否必须配置allUsers调用权限?
你当前遇到的403错误根本原因是:未授予allUsers调用权限的Cloud Function,默认要求请求携带Google Cloud IAM授权的访问令牌,而你前端传递的是Identity Platform的用户ID令牌,无法被Cloud Function的原生IAM校验逻辑识别,因此被拒绝,即使通过负载均衡转发也不会改变这一校验逻辑。
可行实现方案
方案1:直接使用Cloud Storage安全规则(最优,无额外中间层)
这是该场景下成本最低、维护量最小的实现方式,完全不需要部署Cloud Function做签名URL:
- 你使用的Identity Platform和Firebase Auth底层能力互通,Cloud Storage原生支持识别Identity Platform签发的用户ID令牌
- 为你的存储桶配置Firebase安全规则,示例规则如下:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /user_uploads/{userId}/{allPaths=**} { allow write: if request.auth != null && request.auth.uid == userId; } } }
- 前端直接调用Cloud Storage的SDK,携带用户登录Identity Platform后获取的ID令牌即可直接上传文件,不需要额外调用接口获取签名URL
- 完全不需要调整任何Cloud Function权限,也不涉及
allUsers配置,符合企业域限制政策要求
方案2:通过Cloud IAP保护Cloud Function(适合必须使用签名URL的场景)
如果你业务逻辑必须通过Cloud Function生成签名URL(比如需要额外做业务校验、记录上传日志等),可以通过身份感知代理(IAP)解决403问题:
- 保持当前负载均衡对接Cloud Function的架构不变,为负载均衡的后端服务开启IAP能力
- 将IAP的身份提供商配置为你当前使用的Identity Platform实例
- 在IAP的权限配置中,为需要访问的用户/用户组授予
IAP-Secured Web App User角色,不需要为Cloud Function配置allUsers调用权限 - 前端调用时在请求头中携带Identity Platform签发的ID令牌,IAP会自动完成身份校验,校验通过后会将请求转发到后端Cloud Function,不会再返回403错误
方案3:通过Firebase Hosting重定向转发请求(轻量备选)
如果不想使用IAP,也可以通过Firebase Hosting做请求转发:
- 将Cloud Function配置为Firebase可调用函数,或者普通HTTP函数
- 在Firebase Hosting的配置文件中添加重定向规则,将指定路径的请求转发到你的Cloud Function
- 前端通过Firebase Hosting的域名请求接口,不需要直接调用Cloud Function的原生域名,因此不需要为Cloud Function配置
allUsers权限,所有请求由Firebase Hosting边缘层转发,你可以在Cloud Function代码中继续使用Firebase Admin SDK校验请求携带的ID令牌
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

