我一直在尝试开发一个云运行服务,该服务可以访问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部分
我找到了一个解决方案:
首先,似乎默认服务帐户
PROJECT-NUMBER-compute@developer.gserviceaccount.com
不能具有域范围的委派。我注意到,当我启用它,单击保存并刷新页面时,设置被禁用。我决定创建一个新的服务帐户,启用域范围的委派,并且正确保存了设置其次,我使用下一个脚本(source)创建凭据:
因此,在部署容器时,我还上传凭证文件。我相信有一个更安全的选择(比如谷歌秘密管理器),但这目前还有效。另外,我不知道在部署期间上传机密是否是一种不安全的做法
最后,我还不明白如何使用ADC(应用程序默认凭据)来避免上传凭据
相关问题 更多 >
编程相关推荐