使用OAuth2Client验证Firebase Admin自定义Token失败
问题:验证Firebase Admin生成的自定义Token失败
重现流程
- 通过Firebase Admin生成自定义Token:
const additionalClaims = { veiculoId, sinistroId }; const token = await getAuth().createCustomToken(request.auth.uid, additionalClaims);
- 将Token通过POST发送到Node.js/Hono服务,尝试用OAuth2Client解码:
export function verifyIdToken(client: OAuth2Client, idToken: string) { return client.verifyIdToken({ idToken: idToken, audience: client._clientId }); }
报错信息
Error: No pem found for envelope: {"alg":"none","typ":"JWT"}
at OAuth2Client.verifySignedJwtWithCertsAsync (/app/node_modules/google-auth-library/build/src/auth/oauth2client.js:687:19)
at OAuth2Client.verifyIdTokenAsync (/app/node_modules/google-auth-library/build/src/auth/oauth2client.js:50
补充说明
OAuth2Client实例创建方式:
new OAuth2Client({ clientId: environmentVariables.REPORT_CLIENT_ID, clientSecret: environmentVariables.REPORT_CLIENT_SECRET });
问题原因
Firebase自定义Token和ID Token是两种完全不同的令牌:
- 自定义Token采用
alg: none无签名格式,仅用于客户端向Firebase Auth服务器换取正式的ID Token/Refresh Token,不适合直接在服务端做身份验证 - OAuth2Client的
verifyIdToken方法仅支持验证RS256签名的ID Token(由Firebase Auth服务器签发),无法识别无签名的自定义Token
正确验证方案
改用Firebase Admin SDK的verifyCustomToken方法验证自定义Token:
1. 在目标服务中初始化Firebase Admin
import { initializeApp, cert } from 'firebase-admin/app'; import { getAuth } from 'firebase-admin/auth'; // 替换为你的Firebase服务账号密钥文件路径 const serviceAccount = require('./service-account-key.json'); initializeApp({ credential: cert(serviceAccount) });
2. 实现验证逻辑
export async function verifyCustomToken(token: string) { const decodedToken = await getAuth().verifyCustomToken(token); // decodedToken包含uid和你添加的additionalClaims(veiculoId、sinistroId等) return decodedToken; }
内容的提问来源于stack exchange,提问作者ridermansb
相关产品推荐
相关产品推荐

