能否将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
相关产品推荐
相关产品推荐

