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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:33:51