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

Firebase后端Google认证报错:ID Token的aud受众声明不匹配

Firebase后端Google认证报错:ID Token的aud受众声明不匹配

这个问题我太熟了!一眼就能看出问题出在哪——你后端收到的不是Firebase生成的ID Token,而是Google原生OAuth流程返回的Token!

先给你理清楚来龙去脉:
当用Firebase Auth做Google登录时,Firebase会把Google返回的原生Token转换成自己的Firebase ID Token,这个Token的aud字段就是你的Firebase项目ID(也就是报错里的预期值"bitpic")。但如果前端直接调用了Google Sign-In的原生API,拿到的是Google自己的ID Token,它的aud就是你在Google Cloud里创建的OAuth客户端ID(就是报错里那串长长的ID),这自然就和Firebase Admin SDK预期的受众不匹配了。

接下来给你两个解决方向,优先选第一个:

方案一:修正前端登录流程(最推荐)

让前端团队改用Firebase Auth的官方方法完成Google登录,别直接调用Google的原生接口:

  • 前端初始化Firebase Auth后,用signInWithPopup或signInWithRedirect唤起登录:
    import { getAuth, signInWithPopup, GoogleAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, new GoogleAuthProvider())
      .then((result) => {
        // 登录成功后,获取Firebase专属的ID Token
        return result.user.getIdToken();
      })
      .then((idToken) => {
        // 把这个token传给后端
        fetch('/your-backend-auth-api', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ idToken })
        });
      })
      .catch((err) => {
        // 处理登录异常
      });
    

这样前端传给后端的就是标准Firebase ID Token,你现有的verify_google_token函数就能正常验证了。

方案二:若必须用Google原生Token,修改后端验证逻辑

如果前端因为特殊需求必须用Google的原生ID Token,那后端就不能用Firebase Admin的verify_id_token方法了,得换成Google官方的验证方式:

  1. 先安装Google认证库:
    pip install google-auth
    
  2. 调整你的验证函数:
    from google.oauth2 import id_token
    from google.auth.transport import requests
    
    async def verify_google_token(id_token: str):
        try:
            # 这里填入报错里的那个Google OAuth客户端ID
            decoded_token = id_token.verify_oauth2_token(
                id_token, requests.Request(), "1018060832031-v397dko55bp73mgr6r35hbvfkellsc7e.apps.googleusercontent.com"
            )
            # 额外验证issuer,确保是Google官方签发的
            if decoded_token['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
                raise ValueError('无效的Token签发方')
            return decoded_token
        except Exception as e:
            raise_http_exception(400, f"Google authentication failed: {str(e)}")
    

另外,你可以让前端把拿到的Token放到JWT解析工具里看看aud字段,确认是不是我说的情况,这样排查起来更直接。

备注:内容来源于stack exchange,提问作者Khadija Fatima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:09:33