Python Google Cloud库API令牌授权报401错误,求正确实现方法
问题分析与解决方案
你遇到的401错误是因为Google Cloud Storage的Client不支持直接使用google.auth.api_key.Credentials进行身份验证——API Key凭证类型仅适用于少数无需用户身份验证的公开API操作,而list_blobs这类需要访问桶内资源的操作,要求使用OAuth2类型的凭证(比如服务账号凭证)。
下面针对你的需求(Docker环境下仅能使用环境变量),给出两种可行方案:
方案一:使用服务账号凭证(推荐,支持私有存储桶)
如果你的存储桶是私有或需要权限控制,必须使用服务账号凭证。可以将服务账号JSON密钥的内容存入环境变量,无需挂载文件:
import os import json from google.cloud import storage from google.oauth2.service_account import Credentials # 从环境变量读取服务账号JSON内容 sa_json_str = os.environ.get("GCS_SERVICE_ACCOUNT_JSON") if not sa_json_str: raise RuntimeError("请设置GCS_SERVICE_ACCOUNT_JSON环境变量") # 解析JSON生成凭证 credentials = Credentials.from_service_account_info(json.loads(sa_json_str)) # 初始化Client client = storage.Client(project="my-project", credentials=credentials) # 遍历桶内文件 for blob in client.list_blobs("my-bucket"): print(blob.name)
Docker启动时设置环境变量的示例:
docker run -e GCS_SERVICE_ACCOUNT_JSON='{"type": "service_account", ...}' your-image
方案二:使用API Key(仅适用于公开存储桶)
如果你的存储桶设置了公开访问权限,可以直接调用GCS的REST API并传递API Key,官方客户端库不支持这种方式,需要使用请求库:
import os import requests API_KEY = os.environ.get("GCS_API_KEY") BUCKET_NAME = "my-bucket" PROJECT_ID = "my-project" # 调用GCS REST API获取文件列表 response = requests.get( f"https://storage.googleapis.com/storage/v1/b/{BUCKET_NAME}/o", params={"project": PROJECT_ID, "key": API_KEY} ) response.raise_for_status() # 解析返回结果 for item in response.json().get("items", []): print(item["name"])
注意:API Key无法访问私有存储桶,且存在泄露风险,仅建议用于完全公开的资源。
内容的提问来源于stack exchange,提问作者jonsbox
相关产品推荐
相关产品推荐

