【问题标题】:How to authenticate http request, for accessing gcp API services (python)如何验证http请求,以访问gcp API服务(python)
【发布时间】:2022-01-26 13:21:55
【问题描述】:

为了获取已启用的 GCP-api 服务列表,我正在尝试根据 link 中的此 HTTP 请求获取 service.list。

这是我的代码:

import json
from requests.auth import HTTPBasicAuth
import requests
from google.oauth2 import service_account


auth = HTTPBasicAuth('myusername@gmail.com','xyz....')

url = 'https://serviceusage.googleapis.com/v1/projects/my-proj-id123/services'

headers = {
   "Accept": "application/json"
 }

response = requests.request(
   "GET",
   url,
   headers=headers,
   auth=auth
 )
# a=json.loads(response.text)
print(response.text) 

但我收到此错误:

{
  "error": {
    "code": 403,
    "message": "The request is missing a valid API key.",
    "status": "PERMISSION_DENIED"
  }
}

注意:我需要通过 服务帐户api 令牌 获得根据 link 的响应的方法。我有服务帐户密钥 (credential.json) 但我不知道将 http 请求放在哪里。请建议我的程序。

【问题讨论】:

  • 关于如何设置授权的说明位于herecredentials.json 应该位于您的主目录中。
  • Google Cloud 不支持 HTTP 基本授权。对于大多数 API,您必须使用 Bearer 令牌。 授权:Bearer TOKEN.

标签: python google-cloud-platform google-oauth google-api-client google-api-python-client


【解决方案1】:

我鼓励您在与 Google 服务交互时考虑使用 Google 的 SDK。

这些服务不仅提供有助于创建请求和响应的特定语言资源类型,而且您还可以获得更简单的身份验证、日志记录等。

记录在案:

设置:

PROJECT=[[YOUR-PROJECT]]
ACCOUNT=[[YOUR-ACCOUNT]]

python3 -m venv venv
source venv/bin/activate

python3 -m pip install google-auth
python3 -m pip install google-cloud-service-management

gcloud iam service-accounts create ${ACCOUNT} \
--project=${PROJECT}

EMAIL="${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com"

gcloud projects add-iam-policy-binding ${PROJECT} \
--member=serviceAccount:${EMAIL} \
--role=roles/viewer

gcloud iam service-accounts keys create ${PWD}/${ACCOUNT}.json \
--iam-account=${EMAIL}

export GOOGLE_APPLICATION_CREDENTIALS=${PWD}/${ACCOUNT}.json

python3 ./main.py

main.py:

import google.auth
from google.cloud import servicemanagement_v1

credentials,project = google.auth.default()

client = servicemanagement_v1.ServiceManagerClient()

# How to construct the Request
rqst = {
     # Purely for example
    "pageSize": 5,
     # List only project's services
    "consumer_id: "project:{project}".format(
        project=project
    )
}

# Response is a ServiceListPager
resp = client.list_services(request=rqst)

# Which is iterable
for managed_service in resp:
    try:
        # This is a quirk of gRPC Transcoding
        # Convert a ManagedService to JSON
        j=servicemanagement_v1.ManagedService.to_json(managed_service)
        print(j)
    except Exception as e:
        print(e)

产量:

{
  "serviceName": "abusiveexperiencereport.googleapis.com",
  "producerProjectId": ""
}
{
  "serviceName": "acceleratedmobilepageurl.googleapis.com",
  "producerProjectId": ""
}
{
  "serviceName": "accessapproval.googleapis.com",
  "producerProjectId": ""
}
...

【讨论】:

  • 这里如何使用我的 gcp 项目 id 过滤禁用的服务
  • 请阅读文档。您可以在请求中包含设置为项目 ID 的 consumerId
  • 我尝试过提及“consumerId”rqst = { # "pageSize": 5 # Purely for example "consumerId" : "my-proj-id-123" } 但我遇到了错误 pb_type = self._meta.fields[key].pb_type KeyError: 'consumerId' During handling of the above exception, another exception occurred: "Unknown field for {}: {}".format(self.__class__.__name__, key) ValueError: Unknown field for ListServicesRequest: consumerId
  • 今天早上我到电脑前给你试试
  • 不客气。很高兴它工作正常,也很高兴您愿意试用 SDK。
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2023-03-17
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多