如何验证我的云运行服务以访问GSuite用户的gmail消息?

2024-06-02 14:12:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试开发一个云运行服务,该服务可以访问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管理员帐户,也是我要从中读取电子邮件的同一帐户

当我部署服务时,在尝试进行watch调用时,我收到一个400错误,说“前置条件检查失败”

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

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


Tags: httpsgtcomauthapi电子邮件部署www
1条回答
网友
1楼 · 发布于 2024-06-02 14:12:32

我找到了一个解决方案:

首先,似乎默认服务帐户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)

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

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

相关问题 更多 >