如何验证我的 Cloud Run 服务以访问 GSuite 用户的 Gmail 邮件?



我一直在尝试开发一种云运行服务,该服务可以访问GSuite帐户的电子邮件以处理其附件,但是,我在验证我的云运行服务以访问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管理员帐户,也是我要读取电子邮件的同一帐户。

当我部署服务时,我得到一个400错误,说";先决条件检查失败";当尝试进行CCD_ 2调用时。

我在这里读到,当我没有为服务指定服务帐户时,它会使用应用程序默认凭据,默认为云运行的PROJECT-NUMBER-compute@developer.gserviceaccount.com,并且它可以直接访问包含的项目。

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

我找到了一个解决方案:

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

其次,我使用下一个脚本(源代码(来创建凭据:

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)

因此,当我部署容器时,我也会上传de凭据文件。我相信还有一个更安全的选择(例如谷歌密钥管理器(,但这目前有效。此外,我不知道在部署期间上传机密是否是一种不安全的做法。

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

最新更新