使用Kreait Firebase PHP Admin SDK时谷歌服务账号JSON字段缺失报错求助
先看你遇到的致命错误:
Fatal error: Uncaught Kreait\Firebase\Exception\InvalidArgumentException: /var/www/html/cabgotel/google-service-account.json could not be parsed to a Service Account: The following fields are missing/empty in the Service Account specification: project_id, client_id, client_email, private_key...
这个错误指向的核心问题很明确:你当前使用的JSON文件不是Firebase服务账号的私钥文件,或者文件内容不完整/权限有问题。结合你提到已经下载了文件,我帮你梳理几个最可能的排查方向:
1. 你大概率下载错了JSON文件
Firebase控制台里有两种完全不同的JSON文件:
- 一种是给前端Web应用用的配置文件(就是你HTML里
config对象对应的内容),这个文件里只有apiKey、projectId等基础配置,没有服务账号需要的client_id、client_email、private_key这些敏感字段。 - 另一种才是Admin SDK需要的服务账号私钥文件,需要从这里下载:
登录Firebase控制台 → 进入你的项目 → 点击左侧的「设置」图标 → 切换到「服务账号」标签页 → 点击「生成新的私钥」按钮 → 把下载的JSON文件替换掉你当前的google-service-account.json。
⚠️ 注意:这个私钥文件包含项目的敏感权限,绝对不要提交到Git等版本控制系统里!
2. 检查文件权限与路径
即使文件正确,PHP运行的用户(通常是www-data)可能没有读取该文件的权限:
- 在服务器上执行以下命令修改权限:
chown www-data:www-data /var/www/html/cabgotel/google-service-account.json chmod 644 /var/www/html/cabgotel/google-service-account.json - 也可以临时在PHP代码里添加一行,验证文件是否能被读取:
输出内容里应该能看到// 在初始化ServiceAccount之前添加 $fileContent = file_get_contents(__DIR__.'/google-service-account.json'); var_dump($fileContent); exit;project_id、client_email、private_key这些字段,且值都不为空。
3. 修正代码里的数据库引用问题(可选,但避免后续报错)
你的PHP代码里有个小问题:getReference()不需要传入完整的数据库URL,因为你已经在Factory里用withDatabaseUri指定了数据库地址。直接传路径或者空参数即可:
// 原来的错误写法 // $newPost = $database->getReference('https://my_project.firebaseio.com') // 正确写法:操作根节点 $newPost = $database->getReference() // 或者指定具体子节点,比如 // $newPost = $database->getReference('locations')
按照上面的步骤排查,最可能解决你的问题的是第一步——重新下载正确的服务账号私钥文件。如果还有问题,可以再检查文件内容和权限。
内容的提问来源于stack exchange,提问作者aditya aundhekar

