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

能否将Google元数据用于JwtBearerOptions.MetadataAddress?

解决方案:配置JwtBearer支持Google Firebase令牌

可以直接使用Google Firebase的元数据端点,但需要针对Firebase的OIDC格式差异调整JwtBearer配置,解决"kid未找到"的问题。以下是具体配置步骤:

1. 正确设置Firebase元数据地址

Firebase的OIDC元数据端点格式为:

https://securetoken.google.com/<你的Firebase项目ID>/.well-known/openid-configuration

将<你的Firebase项目ID>替换为实际项目ID,赋值给JwtBearerOptions.MetadataAddress。

2. 调整TokenValidationParameters

Firebase令牌的Issuer和Audience有固定格式,必须显式配置:

  • ValidIssuer:https://securetoken.google.com/<你的Firebase项目ID>
  • ValidAudience:你的Firebase项目ID
  • 确保开启ValidateIssuer、ValidateAudience、ValidateIssuerSigningKey验证

3. 修复密钥解析问题(关键)

默认的JwtBearer配置可能无法正确解析Firebase JWKS返回的密钥格式,导致kid匹配失败。可以通过以下两种方式解决:

方式一:自定义ConfigurationManager

显式初始化ConfigurationManager,确保正确获取和解析Firebase的元数据及密钥:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        var firebaseProjectId = "你的Firebase项目ID";
        options.MetadataAddress = $"https://securetoken.google.com/{firebaseProjectId}/.well-known/openid-configuration";

        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = $"https://securetoken.google.com/{firebaseProjectId}",
            ValidateAudience = true,
            ValidAudience = firebaseProjectId,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true
        };

        // 显式配置ConfigurationManager,确保正确解析Firebase元数据
        options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
            options.MetadataAddress,
            new OpenIdConnectConfigurationRetriever(),
            new HttpDocumentRetriever());
    });

方式二:手动加载Firebase签名密钥

如果自定义ConfigurationManager仍有问题,可以直接从Firebase的JWKS端点加载密钥:

// 先获取Firebase的JWKS
var httpClient = new HttpClient();
var jwksResponse = await httpClient.GetStringAsync("https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com");
var jwks = JsonConvert.DeserializeObject<JsonWebKeySet>(jwksResponse);

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        var firebaseProjectId = "你的Firebase项目ID";
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = $"https://securetoken.google.com/{firebaseProjectId}",
            ValidateAudience = true,
            ValidAudience = firebaseProjectId,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            IssuerSigningKeys = jwks.GetSigningKeys()
        };
    });

额外检查点

  • 确认请求中的令牌是Firebase正确颁发的,令牌的kid字段与Firebase JWKS中的kid完全匹配
  • 确保API服务器可以正常访问Firebase的元数据和JWKS端点(无防火墙/代理拦截)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:38:39