Python 在云功能中获取服务帐户凭据,以便在GCP之外调用google服务

Python 在云功能中获取服务帐户凭据,以便在GCP之外调用google服务,python,google-cloud-platform,google-cloud-functions,google-api-python-client,Python,Google Cloud Platform,Google Cloud Functions,Google Api Python Client,我的场景:我需要使用Google-API-python-client从使用服务帐户的云函数调用Google-DBM-API 更新 下面是我尝试运行的示例代码: import google.auth from googleapiclient.discovery import build from google.auth.transport import requests API_NAME = 'doubleclickbidmanager' API_VERSION = 'v1.1' SCOPES

我的场景:我需要使用
Google-API-python-client
从使用服务帐户的云函数调用Google-DBM-API

更新

下面是我尝试运行的示例代码:

import google.auth
from googleapiclient.discovery import build
from google.auth.transport import requests

API_NAME = 'doubleclickbidmanager'
API_VERSION = 'v1.1'
SCOPES = ['https://www.googleapis.com/auth/doubleclickbidmanager']

credentials, project_id = google.auth.default(scopes=SCOPES)

print(credentials.service_account_email)
# prints "default"

credentials.refresh(requests.Request())
print(credentials.service_account_email)
# prints "[service-account]@[project].iam.gserviceaccount.com"

service = build(API_NAME, API_VERSION, credentials=credentials)
service.queries().listqueries().execute()
# local: return the queries
# in CF: Encountered 403 Forbidden with reason "insufficientPermissions"
当我在本地运行时,设置环境变量
GOOGLE\u APPLICATION\u CREDENTIALS=keyfile.json
工作正常

但是在云函数中运行时,我得到了403错误


keyfile.json
使用云函数中设置的相同服务帐户
[service account]@[project].iam.gserviceaccount.com

您必须强制库生成令牌,以强制它完成其所有字段。为此,只需调用重试,如下所示

import google.auth
credentials, project_id = google.auth.default(scopes=SCOPES)

from google.auth.transport import requests
credentials.refresh(requests.Request())
print(credentials._service_account_email)

build(API_NAME, API_VERSION, credentials=credentials)

您必须强制库生成一个令牌,以强制它完成其所有字段。为此,只需调用重试,如下所示

import google.auth
credentials, project_id = google.auth.default(scopes=SCOPES)

from google.auth.transport import requests
credentials.refresh(requests.Request())
print(credentials._service_account_email)

build(API_NAME, API_VERSION, credentials=credentials)

您所说的
但返回的凭据中的电子邮件是默认的
是什么意思?您能解释并显示日志跟踪以及如何打印此日志吗?我指的是凭证。服务帐户电子邮件=
default
不是服务帐户电子邮件。我想这个属性应该等于FUNCTION_IDENTITY env variable您所说的
是什么意思,但是返回的凭据中的电子邮件是默认的
?您能解释并显示日志跟踪以及如何打印此日志吗?我指的是凭证。服务帐户电子邮件=
default
不是服务帐户电子邮件。我想这个属性应该等于使用
凭据运行的函数\u IDENTITY env variable。本地刷新
,并将GOOGLE\u应用程序\u凭据设置为keyfile就可以了。但是当在云函数中运行时,API调用出现403错误。您收到正确的服务帐户电子邮件了吗?如果是,代码的其余部分是什么。您试图调用哪个API?我已经检查了服务帐户电子邮件,在keyfile.json和Cloud函数中都是相同的。我用示例代码更新了问题。遗憾的是,我没有DBM帐户。我试过了。我激活了API。我有403,但这是正常的,我没有帐户,我是未经授权的。我想是DBM配置中的问题,而不是代码中的问题。您是否对DBM或与您的本地源和云函数源不同的东西进行了IP检查?非常感谢,这应该在GCPRunning with
凭据中清楚地记录。本地刷新
,并将GOOGLE\u应用程序\u凭据设置为密钥文件很好。但是当在云函数中运行时,API调用出现403错误。您收到正确的服务帐户电子邮件了吗?如果是,代码的其余部分是什么。您试图调用哪个API?我已经检查了服务帐户电子邮件,在keyfile.json和Cloud函数中都是相同的。我用示例代码更新了问题。遗憾的是,我没有DBM帐户。我试过了。我激活了API。我有403,但这是正常的,我没有帐户,我是未经授权的。我想是DBM配置中的问题,而不是代码中的问题。您是否对DBM或与您的本地来源和云函数来源不同的东西进行了IP检查?非常感谢,这应该在GCP中明确记录