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

使用Python Firebase API时ID Token的aud声明错误问题

解决Firebase自定义令牌验证时的"aud"声明错误

嘿,我帮你捋捋这个问题哈!你遇到的Firebase ID token has incorrect "aud" (audience) claim错误,核心原因是你搞混了Firebase里的两种令牌:自定义令牌(Custom Token)和ID令牌(ID Token),它们的用途完全不一样,不能直接用verify_id_token去验证自定义令牌。

先搞清楚两种令牌的区别

  • 自定义令牌(Custom Token):由后端生成,作用是给那些用自定义认证系统的用户(比如你的自有账号体系)提供一个登录Firebase的凭证。客户端拿到这个令牌后,需要调用Firebase客户端SDK的signInWithCustomToken方法,去交换成ID令牌和刷新令牌。
  • ID令牌(ID Token):客户端登录成功后拿到的短时效令牌,用来传给后端做身份验证。这时候后端才应该用verify_id_token来验证这个令牌的合法性。

正确的流程代码示例

1. 后端生成自定义令牌(你的这部分代码是对的,补充初始化步骤)

import firebase_admin
from firebase_admin import auth

# 先初始化Firebase Admin SDK(如果还没初始化的话)
if not firebase_admin._apps:
    # 替换成你的服务账号密钥路径
    cred = firebase_admin.credentials.Certificate('path/to/your-service-account-key.json')
    firebase_admin.initialize_app(cred)

uid = "your-target-user-id"
# 生成自定义令牌
custom_token = auth.create_custom_token(uid)
# 转成字符串方便传给客户端
print("生成的自定义令牌:", custom_token.decode('utf-8'))

2. 客户端用自定义令牌登录并获取ID令牌(以Web端为例)

// 客户端JavaScript代码,需要先引入Firebase Auth SDK
firebase.auth().signInWithCustomToken(customTokenFromBackend)
  .then((userCredential) => {
    // 从登录后的用户实例获取ID令牌
    return userCredential.user.getIdToken();
  })
  .then((idToken) => {
    // 把ID令牌传给后端接口做验证
    fetch('/your-backend-api/verify-token', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${idToken}`
      }
    });
  })
  .catch((error) => {
    console.error('登录失败:', error);
  });

3. 后端验证客户端传来的ID令牌(这时候用verify_id_token才正确)

# 后端接收ID令牌并验证的函数
def verify_user_id_token(id_token):
    try:
        # 验证ID令牌,check_revoked=True会检查令牌是否被撤销
        decoded_token = auth.verify_id_token(id_token, check_revoked=True)
        # 从解码后的令牌中获取用户UID
        uid = decoded_token['uid']
        print("令牌验证通过,用户UID:", uid)
        return uid
    except auth.InvalidIdTokenError:
        print("错误:无效的ID令牌")
    except auth.RevokedIdTokenError:
        print("错误:该令牌已被撤销")
    except Exception as e:
        print("验证过程出错:", str(e))

为什么你的原代码会报错?

你直接用verify_id_token去验证自定义令牌,而自定义令牌的aud(受众)字段是Firebase项目的服务账号邮箱,而verify_id_token期望的aud值是你的Firebase项目ID,两者不匹配,所以就抛出了这个错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:15:59