如何通过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-testsub字段为目标用户的UID- 同时确保模拟器已启动,且环境变量
FIREBASE_AUTH_EMULATOR_HOST已正确配置,否则Admin SDK会强制验证签名。
内容的提问来源于stack exchange,提问作者Ced
相关产品推荐
相关产品推荐

