如何验证我的 Cloud 运行 服务以访问 GSuite 用户的 gmail 邮件?

How can I authenticate my Cloud Run service to access a GSuite user's gmail messages?

我一直在尝试开发一个 Cloud 运行 服务,该服务可以访问 GSuite 帐户的电子邮件以处理其附件,但是,我在验证我的 Cloud [=33] 时遇到了问题=] 服务来访问 Gmail 的 API。我在服务中部署了以下代码:

from googleapiclient.discovery import build
from googleapiclient._auth import default_credentials

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
creds = default_credentials(scopes=SCOPES)
gmail = build('gmail', 'v1', credentials=creds)

request_body = {
    "topicName": "NAME_OF_MY_PUBSUB_TOPIC"
}
gmail.users().watch(userId="admin@example.com", body=request_body).execute()

其中 admin@example.com 是 GSuite 管理员帐户和我想从中读取电子邮件的同一帐户。

当我部署该服务时,在尝试进行 watch 调用时收到 400 错误提示“前提条件检查失败”。

我读到 here 当我没有为服务指定服务帐户时,它使用应用程序默认凭据,云 运行 默认为 PROJECT-NUMBER-compute@developer.gserviceaccount.com并且它可以完全访问它开箱即用的项目。

我还为 PROJECT-NUMBER-compute@developer.gserviceaccount.com 启用了全域委派,并将 https://www.googleapis.com/auth/gmail.readonly 添加到 Google 管理 > 安全 > API 控制 > 全域委派与默认服务帐户相同的客户端 ID。最后,对于 OAuth 同意屏幕,我将其标记为内部,将我的云 运行 服务 URL 添加到授权域,并将 https://www.googleapis.com/auth/gmail.readonly 添加到范围部分。

我找到了解决方案:

首先,默认的service-accountPROJECT-NUMBER-compute@developer.gserviceaccount.com好像不能有Domain-wide委托。我注意到当我启用它、单击保存并刷新页面时,该设置被禁用。我决定创建一个新的服务帐户,启用 Domain-Wide 委派并正确保存设置。

其次,我使用了下一个脚本 (source) 来创建凭据:

from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
creds = service_account.Credentials.from_service_account_file(PATH_TO_FILE, scopes=SCOPES)
delegated_creds = creds.with_subject('admin@example.com')
gmail = build('gmail', 'v1', credentials=delegated_creds)

所以当我部署容器时,我还上传了凭证文件。我相信有一个更安全的选项(例如 Google Secret Manager),但目前可以使用。另外,我不知道在部署过程中上传机密是否是一种不安全的做法。

最后,我还不明白如何使用 ADC(应用程序默认凭据)来完全避免上传凭据。