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

