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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:08:19