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
相关产品推荐
相关产品推荐

