You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:52:13