Google 云 API - Python - 请求包含无效参数

Google Cloud APIs - Python - Request contains an invalid argument

使用 Google 云 API 和 Oauth2,我尝试列出项目并使用我的 Python 桌面应用程序显示每个项目的 IAM 策略。示例代码如下:

appflow = flow.InstalledAppFlow.from_client_secrets_file("client_secrets.json",
scopes=["https://www.googleapis.com/auth/cloud-platform"])

appflow.run_console()

credentials = appflow.credentials

service = googleapiclient.discovery.build(
    'cloudresourcemanager', 'v1',  credentials=credentials)

operation1 = service.projects().list().execute()

jason=json.dumps(
    operation1,
    sort_keys=True,
    indent=3)
data = json.loads(jason)

#Gets the list of projects in a Python List object [Proj]

proj=[]
for mem in data['projects']:
    print(mem['projectId'])
    proj.append(mem['projectId'])

for prj in proj:
    resource = 'projects/' + prj
    
    response1 = service.projects().testIamPermissions(resource=resource, body=None, x__xgafv=None).execute()
    
    response2 = service.projects().listOrgPolicies(resource=resource, body=None, x__xgafv=None).execute()

    response3 = service.projects().getIamPolicy(resource=resource, body=None, x__xgafv=None).execute()

我在所有 3 个调用中都遇到了类似的错误: googleapiclient.errors.HttpError:https://cloudresourcemanager.googleapis.com/v1/projects/projects%2Fproject-name:testIamPermissions?alt=json 返回“请求包含无效参数”。详细信息:“请求包含无效参数。”>

参数似乎是正确的。 service(cloudresourcemanager) version v1/v3 有区别吗?我错过了什么吗?提前致谢。

我认为您不需要像 HTTPS 示例那样使用 projects/ 解析资源,因为您正在使用的库对您来说应该是抽象的,所以如果您删除 resource = 'projects/' + prj 并尝试直接使用项目 ID 调用

response1 = service.projects().testIamPermissions(resource=prj, body=None, x__xgafv=None).execute()

response2 = service.projects().listOrgPolicies(resource=prj, body=None, x__xgafv=None).execute()

response3 = service.projects().getIamPolicy(resource=prj, body=None, x__xgafv=None).execute()

如果有效,您应该不会再收到错误 400,而是 403“权限被拒绝”,因为您缺少那些 API 调用的某些范围(根据您的代码示例)。

示例google提供

testIamPermissions

listOrgPolicies

getIamPolicy