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

Firebase JWT令牌在Azure Function验证报IDX10516签名失败问题求助

问题排查与解决方案

核心原因

你遇到的IDX10516签名验证失败错误,90%以上的概率是Google公钥定期轮换导致的。Google用于签名Firebase令牌的私钥会定期更新,对应的公钥列表也会同步下线旧公钥、上线新公钥。如果你的验证库没有实现正确的公钥刷新逻辑,长期缓存过期的公钥列表,新生成的Firebase令牌用新私钥签名后,旧公钥列表中找不到对应kid的公钥,就会抛出该错误。

解决步骤

  • 检查公钥缓存逻辑
    不要将公钥硬编码在代码中,也不要设置过长的公钥缓存时间。请求Google公钥接口时,读取响应头Cache-Control字段的max-age值,按照该值设置缓存有效期,到期后自动拉取最新的公钥列表。如果你的二次开发版本之前写死了公钥或者缓存策略不合理,优先修改这部分逻辑。
  • 手动核对kid匹配性
    1. 将测试用的Firebase令牌解码,提取Header部分的kid值
    2. 直接请求Google公钥接口,对比返回的公钥列表中是否存在对应kid的公钥
    3. 如果找不到对应kid:说明你当前使用的令牌是旧私钥签名的,重新登录获取新的Firebase令牌再测试即可
    4. 如果能找到对应kid:说明你的验证库使用的是缓存的旧公钥列表,强制刷新公钥缓存后重试
  • 优化JWT验证配置
    如果你使用的是System.IdentityModel.Tokens.Jwt库做验证,建议配置动态密钥解析逻辑,避免使用静态密钥集合,参考配置如下:
    TokenValidationParameters validationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = "https://securetoken.google.com/你的Firebase项目ID",
        ValidateAudience = true,
        ValidAudience = "你的Firebase项目ID",
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        // 动态解析签名密钥
        IssuerSigningKeyResolver = (token, securityToken, kid, parameters) =>
        {
            // 此处实现拉取最新公钥列表、匹配kid返回对应公钥的逻辑
            return GetLatestGooglePublicKeys().FirstOrDefault(k => k.KeyId == kid);
        }
    };
    
  • 额外排查项
    1. 本地调试时先清理项目缓存、重启Azure Function本地运行时,避免本地缓存了过期的公钥数据
    2. 检查Azure Function的出站网络规则,确保可以正常访问Google的公钥服务,不会出现公钥拉取失败的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:45:03