我正在尝试向Google API发出请求,以使用服务帐户和他的JSON密钥文件创建源存储库。由于该产品没有客户端库,因此我使用以下文档将查询与Python一起使用https://cloud.google.com/source-repositories/docs/reference/rest
我已经成功地使用了类似的代码来调用我的云函数,但这次我在401错误处被阻止了这些请求。我用我的服务帐户的JSON设置了GOOGLE_APPLICATION_CREDENTIALS,赋予服务帐户Source Repository Administrator的权限,但仍然返回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')
谢谢
我也尝试过在url的末尾使用API-KEY,就像这个
不支持API密钥。
您的代码使用的是OIDC身份令牌,而不是OAuth Acess令牌。
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}")