我们公司正在处理来自Google平台的Google ( Google )的数据,我们在认证方面遇到了一些问题。
我们需要在两个不同的地方运行对Google进行API调用的代码:在Google引擎的生产中,以及在开发环境中,即我们的开发人员的笔记本电脑上。
我们公司对凭证非常严格,不允许下载服务帐户凭据JSON密钥(这是更好的实践,并提供了更高的安全性)。看起来,GCP中的所有文档都简单地下载服务帐户的JSON密钥并使用它。或者Google /开发人员说,创建一个OAuth2客户端ID并下载它,就像这里一样。
他们经常使用这样的代码:
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
但是我们不能(或者只是不想)下载我们的服务帐户JSON密钥,所以如果我们只遵循这些文档,我们就会陷入困境。
对于Google环境,我们已经能够通过使用GCP应用程序默认凭据(ADCs)进行身份验证--即不显式指定在代码中使用的凭据并让客户端库“只工作”--只要确保使用正确的作用域https://www.googleapis.com/auth/drive
创建VM,并且将默认的计算服务帐户电子邮件授予需要访问的工作表的权限--这在docs 这里中得到了解释。你可以这样做;
from googleapiclient.discovery import build
service = build('sheets', 'v4')
SPREADSHEET_ID="<sheet_id>"
RANGE_NAME="A1:A2"
s = service.spreadsheets().values().get(
spreadsheetId=SPREADSHEET_ID,
range=RANGE_NAME, majorDimension="COLUMNS"
).execute()
然而,我们如何在本地开发人员的笔记本电脑上进行开发呢?同样,没有下载任何JSON密钥,最好是使用最“只起作用”的方法?
通常,我们使用gcloud auth application-default login
来创建默认的应用程序凭据,而Google库使用这些凭据“只起作用”,比如Google。但是,这并不适用于GCP之外的Google,比如Google service = build('sheets', 'v4')
,它在出现此错误时失败了:“请求没有足够的身份验证作用域”。然后我们尝试了各种各样的解决方案,比如:
credentials, project_id = google.auth.default(scopes=["https://www.googleapis.com/auth/drive"])
和
credentials, project_id = google.auth.default()
credentials = google_auth_oauthlib.get_user_credentials(
["https://www.googleapis.com/auth/drive"], credentials._client_id, credentials._client_secret)
)
还有更多。这都会给我们在尝试对Google进行身份验证时遇到无数的错误/问题:
有什么想法吗?
发布于 2020-08-20 06:27:17
使来自开发环境的身份验证变得简单的一种方法是使用Service模拟。
这里是一个关于使用服务帐户模拟的博客,包括这样做的好处。@johnhanley (他写了这篇博文)是个很棒的人,也有很多信息丰富的答案!
要使本地机器能够为Google进行身份验证,您需要在本地计算机上创建默认应用程序凭据,该应用程序凭据模拟服务帐户,并应用要访问的API所需的作用域。
要能够模拟服务帐户,用户必须具有角色roles/iam.serviceAccountTokenCreator
。此角色可应用于整个项目或个人服务帐户。
您可以使用gcloud
来完成以下操作:
gcloud iam service-accounts add-iam-policy-binding [COMPUTE_SERVICE_ACCOUNT_FULL_EMAIL] \
--member user:[USER_EMAIL] \
--role roles/iam.serviceAccountTokenCreator
完成后,创建本地凭据:
gcloud auth application-default login \
--scopes=openid,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/accounts.reauth \
--impersonate-service-account=[COMPUTE_SERVICE_ACCOUNT_FULL_EMAIL]
这将解决您得到的范围错误。在Drive范围之外添加的三个额外作用域是gcloud auth application-default login
应用和需要的默认作用域。
如果在不使用模拟的情况下应用作用域,则在试图进行身份验证时会出现如下错误:
HttpError: <HttpError 403 when requesting https://sheets.googleapis.com/v4/spreadsheets?fields=spreadsheetId&alt=json returned "Your application has authenticated using end user credentials from the Google Cloud SDK or Google Cloud Shell which are not supported by the sheets.googleapis.com. We recommend configuring the billing/quota_project setting in gcloud or using a service account through the auth/impersonate_service_account setting. For more information about service accounts and how to use them in your application, see https://cloud.google.com/docs/authentication/.">
一旦设置了凭据,就可以使用本地计算机上运行在上的相同代码:)
注意:也可以为所有gcloud命令设置模拟:
gcloud config set auth/impersonate_service_account [COMPUTE_SERVICE_ACCOUNT_FULL_EMAIL]
通过模拟服务帐户在本地计算机上创建默认应用程序凭据是验证开发代码的一种巧妙方法。这意味着代码将具有与它所模拟的服务帐户完全相同的权限。如果这个服务帐户将在生产中运行代码,则您知道开发中的代码运行与生产相同。这也意味着您永远不必创建或下载任何服务帐户密钥。
https://stackoverflow.com/questions/63506885
复制相似问题