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

无文件使用服务账号凭证初始化Firebase Management报Tag '27'不支持错误

问题原因
  • 调用Google IAM接口创建服务账号密钥返回的PrivateKeyData字段是Base64编码的完整服务账号JSON配置文件,不是原始PKCS8格式的私钥字符串。你直接把该字段值拼接PEM头尾后传入解析方法,相当于把JSON的Base64编码内容当作私钥做ASN.1解码,自然会识别到非法标签,抛出Tag '27' not supported异常。
  • 代码存在隐性错误:ServiceAccountCredential.Initializer的构造参数要求传入服务账号邮箱,你当前传的是项目ID,即使私钥解析正确后续也会认证失败。
解决方案

方案1:直接从服务账号JSON创建凭证(最简便)

不需要手动提取私钥,直接解码PrivateKeyData得到完整JSON后加载凭证即可:

private static void InitializeFirebaseManagement()
{
    // Base64解码得到完整服务账号配置JSON
    string serviceAccountJson = Encoding.UTF8.GetString(Convert.FromBase64String(ServiceAccountManager.Datakey.PrivateKeyData));
    
    // 直接从JSON创建带权限范围的凭证
    var credential = GoogleCredential.FromJson(serviceAccountJson)
        .CreateScoped(FirebaseManagementService.Scope.CloudPlatform);
    
    // 初始化Firebase Management服务
    _firebaseManagementService = new FirebaseManagementService(
        new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = CloudManager.ApplicationName
        });
}

方案2:手动提取私钥初始化

如果需要单独处理私钥,先解码JSON后提取内置的私钥字段即可,不需要手动拼接PEM头尾:

private static void InitializeFirebaseManagement()
{
    // 解码得到服务账号JSON
    string serviceAccountJson = Encoding.UTF8.GetString(Convert.FromBase64String(ServiceAccountManager.Datakey.PrivateKeyData));
    // 解析JSON提取必填字段,此处用System.Text.Json为例,也可替换为Newtonsoft.Json
    var saRoot = JsonDocument.Parse(serviceAccountJson).RootElement;
    string serviceAccountEmail = saRoot.GetProperty("client_email").GetString();
    string rawPrivateKey = saRoot.GetProperty("private_key").GetString();
    
    // 初始化服务账号凭证,构造参数为服务账号邮箱
    var serviceCredential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(serviceAccountEmail)
            .FromPrivateKey(rawPrivateKey));
    
    var credential = GoogleCredential.FromServiceAccountCredential(serviceCredential)
        .CreateScoped(FirebaseManagementService.Scope.CloudPlatform);
    
    // 初始化服务
    _firebaseManagementService = new FirebaseManagementService(
        new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = CloudManager.ApplicationName
        });
}

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

相关产品推荐
方舟 Agent Plan

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

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