gpt4 book ai didi

python - 如何在不下载服务帐户凭据的情况下从 Google Compute Engine 和本地验证 Google API(Google Drive API)?

转载 作者:行者123 更新时间:2023-12-04 11:26:45 27 4
gpt4 key购买 nike

我们公司正在处理来自 Google Cloud Platform 的 Google Sheets(在 Google Drive 中)的数据,我们在身份验证方面遇到了一些问题。
我们需要在两个不同的地方运行代码来调用 Google Drive 的 API:在 Google Compute Engine 的生产环境中,以及在开发环境中,即在我们开发人员的笔记本电脑上本地。
我们公司对凭据非常严格,不允许下载服务帐户凭据 JSON key (这是更好的做法并提供更高的安全性)。似乎 GCP 的所有文档都说只需下载服务帐户的 JSON key 并使用它。或者 Google APIs/Developers 文档说要创建一个 OAuth2 客户端 ID 并下载它的 key ,如 here .
他们经常使用这样的代码:

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 key ,所以如果我们只是按照文档进行操作,我们就会陷入困境。
对于 Google Compute Engine 环境,我们已经能够使用 GCP 应用程序默认凭据 (ADC) 进行身份验证——即没有明确指定要在代码中使用的凭据并让客户端库“正常工作”——只要确保VM 是使用正确的范围创建的 https://www.googleapis.com/auth/drive ,并且默认计算服务帐户电子邮件被授予需要访问的工作表的权限 - 这在文档 here 中进行了解释。 .你可以这样做;
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 key ,最好使用最“可行”的方法?
通常我们使用 gcloud auth application-default login创建 Google 客户端库使用的默认应用程序凭据,这些凭据“可以正常工作”,例如用于 Google Storage。但是,这不适用于 GCP 之外的 Google API,例如 Google Drive API 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 Drive API 进行身份验证时,所有这些都会导致我们无法解决的无数错误/问题:(
有什么想法吗?

最佳答案

使开发环境中的身份验证变得容易的一种方法是使用服务帐户模拟。
Here是一个关于使用服务帐户模拟的博客,包括这样做的好处。 @johnhanley(撰写博客文章的人)是一个很棒的人,并且在 SO 上也有很多非常有用的答案!
为了能够让您的本地机器对 Google Drive API 进行身份验证,您需要在模拟服务帐户的本地机器上创建默认应用程序凭据,并应用您要访问的 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=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 API 范围之外添加的三个额外范围是 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/.">
设置凭据后,您可以使用在本地计算机上的 Google Compute Engine 上运行的相同代码:)
注意:还可以为所有 gcloud 命令设置模拟:
gcloud config set auth/impersonate_service_account [COMPUTE_SERVICE_ACCOUNT_FULL_EMAIL]
通过模拟服务帐户在本地计算机上创建默认应用程序凭据是验证开发代码的一种巧妙方法。这意味着该代码将与它所模拟的服务帐户具有完全相同的权限。如果这是将在生产中运行代码的同一个服务帐户,则您知道开发中的代码与生产中运行的代码相同。这也意味着您永远不必创建或下载任何服务帐户 key 。

关于python - 如何在不下载服务帐户凭据的情况下从 Google Compute Engine 和本地验证 Google API(Google Drive API)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63506885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com