使用Firebase Auth模拟器创建验证JWT令牌时audience不匹配问题解决
解决Firebase Auth模拟器本地开发的令牌aud不匹配问题
问题场景
本地开发时使用Firebase Admin SDK结合Auth模拟器,针对项目demo-project编写了用户查找、令牌签发与验证代码,但触发令牌受众(aud)不匹配错误:期望aud为demo-project,实际返回https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit。需要在不依赖托管Firebase项目的前提下,正确初始化Admin SDK适配模拟器环境。
原代码示例:
Environment.SetEnvironmentVariable("FIREBASE_AUTH_EMULATOR_HOST", "localhost:9099"); Environment.SetEnvironmentVariable("GCLOUD_PROJECT", "demo-project"); var email = [EMAIL]; GoogleCredential dummyCredential = GoogleCredential.FromAccessToken("test-token"); var app = FirebaseApp.Create(new AppOptions { Credential = dummyCredential }); var auth = FirebaseAuth.GetAuth(app); var user = await auth.GetUserByEmailAsync(email); var token = await auth.CreateCustomTokenAsync(user.Uid); var verifiedToken = await auth.VerifyIdTokenAsync(token);
解决方案
问题出在手动指定了GoogleCredential,Firebase Admin SDK在连接Auth模拟器时不需要真实或自定义凭证,强制设置凭证会覆盖模拟器的默认配置,导致aud字段生成错误。正确的初始化方式如下:
- 移除自定义GoogleCredential:模拟器环境下,Admin SDK会自动处理认证,无需手动提供凭证。
- 确保项目ID正确设置:
GCLOUD_PROJECT环境变量必须准确设置为你的本地项目ID(demo-project),这是生成正确aud字段的关键。
修改后的代码:
Environment.SetEnvironmentVariable("FIREBASE_AUTH_EMULATOR_HOST", "localhost:9099"); Environment.SetEnvironmentVariable("GCLOUD_PROJECT", "demo-project"); var email = [EMAIL]; // 不指定Credential,让SDK自动适配模拟器环境 var app = FirebaseApp.Create(new AppOptions()); var auth = FirebaseAuth.GetAuth(app); var user = await auth.GetUserByEmailAsync(email); var token = await auth.CreateCustomTokenAsync(user.Uid); var verifiedToken = await auth.VerifyIdTokenAsync(token);
关键说明
- 当
FIREBASE_AUTH_EMULATOR_HOST环境变量存在时,Admin SDK会自动切换到模拟器模式,此时无需提供任何真实的Google服务账号凭证。 GCLOUD_PROJECT环境变量会被SDK用来生成正确的aud字段值,确保与你的本地项目ID一致。
内容的提问来源于stack exchange,提问作者Per Ökvist
相关产品推荐
相关产品推荐

