0

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

我已经使用类似的代码成功调用了我的云功能,但是这次我在 401 错误时阻止了这些请求。我使用我的服务帐户的 JSON 设置了 GOOGLE_APPLICATION_CREDENTIALS,为服务帐户授予源存储库管理员的权限,但仍然返回 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')

谢谢

4

1 回答 1

2

我也尝试在这样的 url 末尾使用 API-KEY

不支持 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}")
于 2021-12-06T23:31:22.767 回答