NodeJS集成FCM推送报错app/invalid-credential求助
FCM推送报错
app/invalid-credential:metadata.google.internal解析失败的排查与解决 问题重现
代码未做任何修改,昨日运行正常,今日调用FCM推送时返回错误:
{ "code": "app/invalid-credential", "message": "Credential implementation provided to initializeApp() via the \"credential\" property failed to fetch a valid Google OAuth2 access token with the following error: \"Error fetching access token: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND\"." }
核心初始化代码依赖applicationDefault()自动获取凭证:
initializeApp({ credential: applicationDefault(), projectId: "ecfile-test", });
原因分析
applicationDefault()的工作逻辑是从环境自动加载凭证:
- 在GCP托管服务(如Cloud Functions、App Engine、Compute Engine)中,会通过GCP内部元数据服务器(
metadata.google.internal)获取临时凭证 - 若服务运行在非GCP环境(本地服务器、自建机房、其他云厂商),或者GCP环境下网络策略变更(防火墙拦截、DNS解析故障),导致无法访问元数据服务器,就会触发该错误。
解决方法
场景1:服务运行在非GCP环境
直接改用GCP服务账号密钥文件初始化凭证,两种实现方式:
方式1:代码中指定密钥文件
- 从GCP控制台「IAM与管理员-服务账号」页面,下载目标服务账号的JSON密钥文件
- 修改初始化代码:
import { initializeApp, cert } from "firebase-admin/app"; import { getMessaging } from "firebase-admin/messaging"; // 导入密钥文件,注意路径正确 import serviceAccount from "./serviceAccountKey.json"; initializeApp({ credential: cert(serviceAccount), projectId: "ecfile-test", });
方式2:通过环境变量指定密钥路径
无需修改代码,设置环境变量让applicationDefault()自动读取:
# Linux/macOS终端 export GOOGLE_APPLICATION_CREDENTIALS="/绝对路径/to/serviceAccountKey.json" # Windows命令行 set GOOGLE_APPLICATION_CREDENTIALS="C:\绝对路径\to\serviceAccountKey.json"
场景2:服务运行在GCP环境
- 检查元数据服务连通性:在GCP实例内执行以下命令,验证能否访问元数据服务器
curl http://metadata.google.internal/computeMetadata/v1/instance/name -H "Metadata-Flavor: Google"
返回实例名称则服务正常,否则需排查网络问题。
2. 检查防火墙规则:确保实例所在VPC未拦截对169.254.169.254(元数据服务器内部IP)的访问
3. 重启服务实例:临时网络连接异常可能引发该问题,重启后重试。
内容的提问来源于stack exchange,提问作者MYOUSUFFS
相关产品推荐
相关产品推荐

