如何验证我的 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 进行身份验证