使用 Python 向 Google API 发出请求

Make requests to Google API with Python

我正在尝试向 Google API 发出请求,以使用服务帐户及其 JSON 密钥文件创建源存储库。 由于此产品没有客户端库,因此我使用此文档使用 Python 的查询 https://cloud.google.com/source-repositories/docs/reference/rest

我已经使用类似的代码成功调用了我的云函数,但这次我在 401 错误时阻止了这些请求。我用我的服务帐户的 JSON 设置了 GOOGLE_APPLICATION_CREDENTIALS,给服务帐户 Source Repository Administrator 的权限,但仍然是 return 401.

这是我的代码

import urllib.request
import json
import urllib
import google.auth.transport.requests
import google.oauth2.id_token

body = { "name" : "projects/$my_project_name/repos/$name_repo"}
jsondata = json.dumps(body).encode("utf8")
req = urllib.request.Request('https://sourcerepo.googleapis.com/v1/projects/$my_project_name/repos')
req.add_header('Content-Type', 'application/json; charset=utf-8')

auth_req = google.auth.transport.requests.Request()
id_token = google.oauth2.id_token.fetch_id_token(auth_req, 'https://www.googleapis.com/auth/cloud-platform')
req.add_header("Authorization", f"Bearer {id_token}")
response = urllib.request.urlopen(req, jsondata)
print (response.read().decode())

我也试过在 url 的末尾使用带有 API-KEY 的

req = urllib.request.Request('https://sourcerepo.googleapis.com/v1/projects/$my_project_name/repos?key=$my-api-key')

谢谢

I tried also using the with an API-KEY at the end of the url like this

API 不支持密钥。

您的代码使用的是 OIDC 身份令牌,而不是 OAuth 访问令牌。

from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(
    '/path/to/key.json',
    scopes=['https://www.googleapis.com/auth/cloud-platform'])


request = google.auth.transport.requests.Request()
credentials.refresh(request)

// 使用以下代码添加访问令牌:

req.add_header("Authorization", f"Bearer {credentials.token}")