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

Python脚本调用受Firebase认证保护的GCP云函数报未授权错误

问题背景

我部署了一个校验Firebase Authentication身份的GCP Cloud Function,函数会校验请求头Authentication中携带的idToken值。现需要编写脚本支持用户完成认证后调用该函数,初始实现代码如下:

from google_auth_oauthlib import flow
import httpx

appflow = flow.InstalledAppFlow.from_client_secrets_file(
    'client_secret.apps.googleusercontent.com.json',
    scopes=['openid',
            'https://www.googleapis.com/auth/userinfo.email',
            'https://www.googleapis.com/auth/userinfo.profile'],
)
creds = appflow.run_local_server()
print(creds.valid)

response = httpx.post(
    'https://us-central1-myproject.cloudfunctions.net/myfunction',
    headers={'Authorization': 'Bearer ' + creds.id_token}
)
print(response.status_code)
print(response.text)

运行脚本并使用合法用户账号登录发起调用时,收到Cloud Function返回的Unauthorized错误,后端解析verifyIdToken返回的报错信息为:

Firebase ID token has incorrect "aud" (audience) claim.

确认当前获取到的ID Token不符合接口校验要求。

问题原因

当前代码通过通用Google OAuth2流程拿到的ID令牌,不是Firebase Authentication签发的合规令牌,核心差异在aud(受众)字段:

  • 现有代码加载的是手动创建的普通GCP OAuth客户端密钥,签发的ID令牌aud值为该普通客户端的ID
  • Firebase Admin SDK的verifyIdToken校验逻辑要求,传入ID令牌的aud必须匹配当前Firebase项目自动生成的Web应用客户端ID(格式通常为<你的项目ID>.firebaseapp.com),普通OAuth客户端签发的令牌不满足这个要求,因此直接返回认证失败。
修复方案

更换令牌获取方式,拿到Firebase Auth签发的合规ID令牌即可:

  • 推荐直接使用Firebase Auth官方客户端SDK完成用户登录流程,登录成功后返回的ID令牌可直接用于接口调用
  • 如果需要保留现有本地拉起浏览器登录的交互,需要将from_client_secrets_file加载的密钥文件,替换为Firebase控制台中项目对应Web应用的客户端密钥,不能使用手动创建的普通GCP OAuth客户端密钥
  • 可先在Firebase控制台认证模块手动生成测试用户的ID令牌,放到请求头中调用接口,若返回200即可确认问题根源判断正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:57:26