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

如何通过Firebase Admin获取Firebase模拟器测试用认证JWT

Firebase模拟器测试:获取正确JWT用于用户认证

我需要用Firebase Admin生成JWT,在测试套件里以用户身份登录Firebase模拟器(当前用的是Firebase的「demo」项目,不会访问真实端点),但尝试两种方法都报错了:

尝试过的方法及报错

方法1:创建自定义Token

代码:

const user = await admin.auth().createUser({ uid: randomUUID() });
const jwt = await admin.auth().createCustomToken(user.uid);

报错信息:

Firebase ID token has incorrect "aud" (audience) claim. Expected "demo-test" but got "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"

方法2:手动创建无签名JWT

根据Firebase文档说明「设置环境变量后,Firebase Admin SDK会接受无签名ID Token」,尝试手动生成JWT,但报错:

Firebase ID token has invalid signature.

正确解决步骤

1. 分清自定义Token和ID Token的区别

createCustomToken生成的是自定义Token,它的作用是给客户端SDK换取真正的ID Token,不能直接用来做认证凭证。

2. 通过模拟器API换取合规ID Token

利用Firebase模拟器的Auth REST接口,把自定义Token转换成符合要求的ID Token:

// 1. 先创建用户并生成自定义Token
const user = await admin.auth().createUser({ uid: randomUUID() });
const customToken = await admin.auth().createCustomToken(user.uid);

// 2. 调用模拟器端点换取ID Token
const response = await fetch('http://localhost:9099/identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=demo-test', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ token: customToken, returnSecureToken: true })
});

const authData = await response.json();
const validIdToken = authData.idToken; // 这个就是能用于认证的ID Token

3. 必须正确设置环境变量

要让Admin SDK信任模拟器的Token,必须提前设置环境变量:

  • 终端环境:
export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"
  • Node.js代码内设置:
process.env.FIREBASE_AUTH_EMULATOR_HOST = 'localhost:9099';

4. 手动生成无签名Token的注意事项

如果一定要手动生成无签名JWT,必须满足:

  • aud字段值为你的项目ID(这里是demo-test)
  • iss字段值为https://securetoken.google.com/demo-test
  • sub字段为目标用户的UID
  • 同时确保模拟器已启动,且环境变量FIREBASE_AUTH_EMULATOR_HOST已正确配置,否则Admin SDK会强制验证签名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:52:19