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

