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

Github Actions中用applicationDefault初始化Firebase报错:凭据文件内容无效

修复GitHub Actions中Firebase Admin初始化的"Invalid contents in the credentials file"错误(工作负载身份联合认证场景)

问题背景

Node.js应用通过Firebase Admin的applicationDefault()初始化,在GitHub Actions中使用工作负载身份联合认证对接GCP后,运行测试时抛出凭证文件内容无效的错误,且不想使用长期服务账号JSON密钥。

解决方案

1. 修改Firebase初始化逻辑,适配临时凭证

直接调用无参数的initializeApp(),让Firebase Admin自动走GCP的ADC(应用默认凭证)链,绕过文件解析的问题:

import { initializeApp } from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';

// 无需手动指定credential,让ADC自动处理凭证获取
const app = initializeApp({
  projectId: process.env.FIREBASE_PROJECT_ID, // 仍需指定项目ID
});

export const auth = getAuth(app);

如果需要兼容本地开发,可添加本地环境的fallback:

import { initializeApp, cert } from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';

let app;
if (process.env.NODE_ENV === 'development') {
  // 本地开发使用服务账号密钥文件
  const serviceAccount = require('./local-service-account.json');
  app = initializeApp({
    credential: cert(serviceAccount),
    projectId: process.env.FIREBASE_PROJECT_ID,
  });
} else {
  // CI环境自动使用ADC凭证流
  app = initializeApp({
    projectId: process.env.FIREBASE_PROJECT_ID,
  });
}

export const auth = getAuth(app);

2. 明确GitHub Actions的认证配置

显式指定临时凭证文件路径,避免路径歧义:

- id: 'auth'
  name: 'Authenticate to Google Cloud'
  uses: 'google-github-actions/auth@v2'
  with:
    workload_identity_provider: 'PATH-TO-PROVIDER'
    service_account: 'XXXXXXX@XXXXXX.iam.gserviceaccount.com'
    create_credentials_file: true
    export_environment_variables: true
    credentials_file_path: '/tmp/gcp-credentials.json'

测试步骤前显式导出环境变量,防止传递异常:

- name: Run tests
  run: |
    export GOOGLE_APPLICATION_CREDENTIALS="/tmp/gcp-credentials.json"
    pnpm run lint
    pnpm run test

3. 验证服务账号权限

确保用于联合认证的服务账号拥有以下必要权限:

  • Firebase Admin SDK Administrator Service Agent
  • 对应Firebase服务的权限(如Firestore Datastore User、Firebase Auth Admin等)

问题根源

GitHub Actions工作负载身份联合认证生成的临时凭证,结构和传统长期服务账号密钥不同——临时凭证是短期令牌格式,而applicationDefault()会尝试将其解析为包含private_key等字段的标准服务账号密钥,导致解析失败。直接调用无参数的initializeApp(),会让Firebase Admin正确使用ADC的临时凭证流,而非读取文件解析密钥。

内容的提问来源于stack exchange,提问作者sc-leeds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:07:27