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

使用OAuth2Client验证Firebase Admin自定义Token失败

问题:验证Firebase Admin生成的自定义Token失败

重现流程

    1. 通过Firebase Admin生成自定义Token:
const additionalClaims = { veiculoId, sinistroId };
const token = await getAuth().createCustomToken(request.auth.uid, additionalClaims);
    1. 将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:48:24