如何在Python请求中向Google Cloud API传递认证凭据?
解决Python调用Google Cloud Dataflow API时的401认证问题
你碰到的这个401错误,核心就是请求里没带上Google Cloud认可的认证凭据。用服务账号来认证的话,推荐用官方的google-auth库来处理,比手动生成令牌靠谱多了,下面是具体步骤和修改后的代码:
步骤1:安装依赖库
先确保你装了必要的包:
pip install google-auth requests
步骤2:准备服务账号密钥
从Google Cloud控制台下载你的服务账号密钥文件(JSON格式),记住它的本地路径,比如/path/to/your/service-account-key.json。
步骤3:修改你的代码
下面是更新后的完整代码,我加了认证逻辑,同时也修正了请求体的发送方式(Google API需要JSON格式,之前的data=data会以表单形式发送,这也是潜在问题):
import requests from google.oauth2 import service_account from google.auth.transport.requests import Request # 1. 配置认证相关 SERVICE_ACCOUNT_FILE = '/path/to/your/service-account-key.json' # Dataflow API需要的权限范围 SCOPES = ['https://www.googleapis.com/auth/cloud-platform'] # 加载服务账号凭据 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) # 获取有效的访问令牌 credentials.refresh(Request()) # 2. 原有API配置 api_endpoint = "https://dataflow.googleapis.com/v1b3/projects/projectid/templates" data = { "jobName": "scriptjob2", "parameters": { "inputFilePattern": "gs://bucket/files/*.json", "outputTopic": "projects/project6/topics/data" }, "environment": { "tempLocation": "gs://bucket/tmp", "zone": "us-central1-f" }, "gcsPath": "gs://dataflow-templates/latest/GCS_Text_to_Cloud_PubSub", "location": "us-central1" } # 3. 发送带认证的POST请求 headers = { 'Authorization': f'Bearer {credentials.token}', 'Content-Type': 'application/json' } r = requests.post(url=api_endpoint, json=data, headers=headers) result = r.text print("Result:%s"%result)
额外说明:如果代码运行在Google Cloud服务上
如果你的代码是跑在GCE、GKE、Cloud Functions这类Google Cloud托管服务上,根本不需要手动指定密钥文件——Google会自动为你提供默认应用凭据,你可以把认证部分改成这样:
from google.auth import default from google.auth.transport.requests import Request credentials, project_id = default(scopes=SCOPES) credentials.refresh(Request())
这样更安全,也不用管理密钥文件。
最后再提一句:之前的请求用data=data是把数据以表单形式发送,而Google Cloud API几乎都要求JSON格式的请求体,所以改成json=data是必须的,这也是你之前可能遇到的隐藏问题。
内容的提问来源于stack exchange,提问作者Samir Khan
相关产品推荐
相关产品推荐

