Laravel上传图片至Firestore Storage遇401无效凭证错误求助
Laravel上传Firebase Storage报401 Invalid Credentials问题解决
问题分析
你遇到的401错误是认证凭据无效导致的,同时代码里还有两处细节错误需要修正:
代码中的明显错误
$objectName = $request->file('banner');这里直接将上传文件对象赋值给文件名变量,应该取文件原始名称或自定义文件名,比如$objectName = $request->file('banner')->getClientOriginalName();public_path('/public/firebase-temp-uploads')路径冗余,public_path()本身已指向项目public目录,应改为public_path('firebase-temp-uploads'),否则会生成public/public/...的错误路径
核心解决步骤:配置Firebase认证凭据
- 登录Firebase控制台,进入项目设置→服务账号→点击「生成新的私钥」,下载JSON格式的服务账号密钥文件
- 将JSON文件放到Laravel项目根目录,命名为
firebase-service-account.json(记得添加到.gitignore避免提交到版本库) - 初始化
StorageClient时指定凭据路径,或设置环境变量GOOGLE_APPLICATION_CREDENTIALS指向该文件路径
修正后的完整代码
$bucketName = 'my-bucket'; // 正确获取上传文件的原始名称 $objectName = $request->file('banner')->getClientOriginalName(); // 修正临时存储路径,确保目录存在 $tempDir = public_path('firebase-temp-uploads'); if (!file_exists($tempDir)) { mkdir($tempDir, 0755, true); } $source = $request->file('banner')->move($tempDir); // 初始化StorageClient时传入认证凭据 $storage = new StorageClient([ 'keyFilePath' => base_path('firebase-service-account.json') ]); $file = fopen($source, 'r'); $bucket = $storage->bucket($bucketName); $object = $bucket->upload($file, [ 'name' => $objectName ]); printf('Uploaded %s to gs://%s/%s' . PHP_EOL, basename($source), $bucketName, $objectName); // 可选:上传完成后删除临时文件 unlink($source);
额外注意事项
- 检查Firebase存储桶规则:在Firebase控制台存储页面的「规则」标签,确保服务账号拥有上传权限,例如设置
allow write: if request.auth != null;(可根据业务需求调整)
内容的提问来源于stack exchange,提问作者KgosiE
相关产品推荐
相关产品推荐

