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

