如何验证我的 Cloud Run 服务以访问 GSuite 用户的 gmail 消息?

Posted

技术标签:

【中文标题】如何验证我的 Cloud Run 服务以访问 GSuite 用户的 gmail 消息?【英文标题】:How can I authenticate my Cloud Run service to access a GSuite user's gmail messages? 【发布时间】:2021-02-10 10:43:12 【问题描述】:

我一直在尝试开发一个 Cloud Run 服务,该服务可以访问 GSuite 帐户的电子邮件以处理其附件,但是,我在验证我的 Cloud Run 服务以访问 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,当我没有为服务指定服务帐户时,它使用应用程序默认凭据,对于 Cloud Run,它默认为PROJECT-NUMBER-compute@developer.gserviceaccount.com,并且它可以完全访问它所包含的项目开箱即用。

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

【问题讨论】:

【参考方案1】:

我找到了解决办法:

首先,默认服务帐户PROJECT-NUMBER-compute@developer.gserviceaccount.com 似乎不能具有域范围的委派。我注意到当我启用它时,单击保存并刷新页面,该设置被禁用。我决定创建一个新的服务帐户,启用域范围委派,设置已正确保存。

其次,我使用下一个脚本 (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(应用程序默认凭据)来避免上传凭据。

【讨论】:

以上是关于如何验证我的 Cloud Run 服务以访问 GSuite 用户的 gmail 消息?的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Scheduler 调用 Cloud Run 服务的身份验证

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

如何从Java脚本安全地调用Google Cloud Run服务?

在公共 Cloud Run 服务上使用 Pub/Sub

Google Cloud Run 身份验证服务到服务

Google Cloud App Engine - gsutil 访问问题