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

Firebase ID Token校验失败:发行方与受众错误排查求助

问题

环境:Ionic 6、Firebase 9,后端采用PHP并集成Firebase Admin SDK for PHP。前端初始化Firebase后,通过GoogleAuthProvider授权获取包含idToken的credential,将该idToken发送至PHP后端。后端使用Firebase Admin SDK配置文件初始化Auth服务,调用verifyIdToken校验token时,出现以下错误:

  • 'The token was not issued by the given issuers'(令牌并非由指定的发行方签发)
  • 'The token is not allowed to be used by this audience'(该受众无权使用此令牌)

前端初始化代码

const firebaseConfig = {
    apiKey: "KEY",
    authDomain: "DOMAIN.firebaseapp.com",
    projectId: "PROJECT_ID",
    storageBucket: "STORAGE.appspot.com",
    messagingSenderId: "SENDER_ID",
    appId: "APP_ID",
    measurementId: "M_ID"
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);

获取Credential代码

const credential = GoogleAuthProvider.credentialFromResult(result);

Firebase Admin SDK配置

{
  "type": "service_account",
  "project_id": "PROJECT_ID",
  "private_key_id": "PRIVATE_KEY_ID",
  "private_key": "-----BEGIN PRIVATE KEY-----
  ................
  -----END PRIVATE KEY-----\n",
  "client_email": "CLIENT_ADMIN@PROJECT_ID.iam.gserviceaccount.com",
  "client_id": "CLIENT_ID",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/CLIENT_ADMIN%40PROJECT_ID.iam.gserviceaccount.com"
}

后端校验代码

$config = file_get_contents('firebase-adminsdk.json');

$factory = (new Factory)->withServiceAccount($config);
$auth = $factory->createAuth();

try {
    $verifiedIdToken = $auth->verifyIdToken($token);

    $uid = $verifiedIdToken->claims()->get('sub');

    $user = $auth->getUser($uid);

} catch (FailedToVerifyToken $e) {
    echo 'The token is invalid: ' . $e->getMessage();
}

错误原因分析

1. 令牌发行方不匹配(The token was not issued by the given issuers)

  • 前端可能误传了非Firebase Auth签发的Token:GoogleAuthProvider.credentialFromResult返回的是Google OAuth凭证对象,其中只有idToken字段是Firebase Auth签发的ID Token。如果直接发送整个credential对象或其他字段(比如access token),就会导致发行方校验失败。
  • 前后端Firebase项目不匹配:后端Admin SDK配置的project_id和前端初始化的projectId不一致,Token的iss(发行方)声明会与后端预期的发行方不匹配。

2. 受众不匹配(The token is not allowed to be used by this audience)

  • 前后端项目ID不一致:Firebase ID Token的aud(受众)字段是项目的project_id,如果后端配置的项目ID和前端项目ID不匹配,后端会认为该Token不属于当前项目,从而拒绝校验。
  • 误传非Firebase ID Token:比如发送了Google OAuth的access token,其aud字段是Google的客户端ID,而非你的Firebase项目ID,自然无法通过后端校验。

核心排查方向

  • 修正前端Token提取逻辑:确保发送的是credential.idToken,而非整个credential对象,代码示例:
    const credential = GoogleAuthProvider.credentialFromResult(result);
    const idToken = credential.idToken; // 提取正确的Firebase ID Token
    // 将idToken发送至后端
    
  • 核对前后端项目ID:确认前端firebaseConfig中的projectId和后端Admin SDK配置文件里的project_id完全一致,包括大小写和拼写。
  • 解析Token验证声明:可以用JWT解析工具查看前端发送的Token,确认iss(格式应为https://securetoken.google.com/[你的项目ID])和aud(应为你的项目ID)是否与后端项目匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:24:25