使用Python上传PDF至Google Cloud Bucket时遇认证错误求助
解决Firebase存储桶PDF上传时的GCE元数据服务错误
这个错误的核心原因是你在本地(非Google Compute Engine环境)运行代码,但storage.Client()默认尝试从GCE元数据服务获取认证凭据,而本地环境无法访问这个服务,导致认证失败。你已经通过Firebase Admin加载了服务账号凭据,但没有将其传递给Storage客户端,所以客户端走了默认的认证流程。
方案一:直接将服务账号凭据传给Storage客户端
修改代码,在创建storage.Client时显式传入加载好的凭据:
from google.cloud import storage from google.oauth2 import service_account # 加载服务账号密钥文件 cred = service_account.Credentials.from_service_account_file('CERTIFICATE') def upload_pdf_to_storage(pdf_path, bucket_name, destination_blob_name): # 传入凭据创建Storage客户端 storage_client = storage.Client(credentials=cred) bucket = storage_client.bucket(bucket_name) blob = bucket.blob(destination_blob_name) blob.upload_from_filename(pdf_path) # 使用示例 pdf_path = 'sample_cv.pdf' bucket_name = "MYBUCKETNAME" destination_blob_name = "pdfs/pdf_filename.pdf" upload_pdf_to_storage(pdf_path, bucket_name, destination_blob_name)
方案二:通过Firebase Admin SDK获取存储桶(更贴合Firebase使用场景)
利用Firebase Admin初始化时的配置直接获取存储桶,无需单独创建storage.Client:
import firebase_admin from firebase_admin import credentials from firebase_admin import storage # 初始化Firebase Admin,同时指定存储桶名称 cred = credentials.Certificate('CERTIFICATE') firebase_admin.initialize_app(cred, { 'storageBucket': 'MYBUCKETNAME' # 替换为你的存储桶完整名称,格式通常是[项目ID].appspot.com }) def upload_pdf_to_storage(pdf_path, destination_blob_name): # 直接从Firebase App获取存储桶 bucket = storage.bucket() blob = bucket.blob(destination_blob_name) blob.upload_from_filename(pdf_path) # 使用示例 pdf_path = 'sample_cv.pdf' destination_blob_name = "pdfs/pdf_filename.pdf" upload_pdf_to_storage(pdf_path, destination_blob_name)
额外注意事项
- 确保服务账号密钥文件(
CERTIFICATE)的路径正确,且当前运行环境有读取该文件的权限 - 存储桶名称要准确,可在Firebase控制台的「存储」页面查看完整名称
- 服务账号需具备
Storage Object Creator或更高权限,否则会出现上传权限不足的错误
内容的提问来源于stack exchange,提问作者Momo0815
相关产品推荐
相关产品推荐

