如何解决如何验证我的Cloud Run服务以访问GSuite用户的gmail消息?
我一直在尝试开发一种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
添加到范围部分。
解决方法
我找到了解决方法:
首先,似乎默认的服务帐户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(应用程序默认凭据)来避免完全上传凭据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。