我有一个python应用程序,我想在appengine(第二代python3.7)上部署,我使用一个启用了域范围内委派的服务帐户来访问用户数据。在
在当地我会:
import google.auth
from apiclient.discovery import build
creds, project = google.auth.default(
scopes=['https://www.googleapis.com/auth/admin.directory.user', ],
)
creds = creds.with_subject(GSUITE_ADMIN_USER)
service = build('admin', 'directory_v1', credentials=creds)
这很好用,据我所知,这是当前使用应用程序默认凭据时的方法(在本地,我定义了GOOGLE_Application_凭据)。在
问题出在GAE上,部署时,对with_subject
的调用将引发:
AttributeError: 'Credentials' object has no attribute 'with_subject'
我已经在GAE服务帐户上启用了域范围的委派。在
我在本地使用的GOOGLE_APPLICATION_凭据与GAE中的GOOGLE_APPLICATION_凭据有什么不同,因为它们都是具有域范围委派的服务帐户?在
GAE上的.with_subject()
在哪里?在
接收到的creds
对象属于compute_engine.credentials.Credentials
类型。在
完全回溯:
^{pr2}$包装(部分列表):
google-api-core==1.5.0
google-api-python-client==1.7.4
google-auth==1.5.1
google-auth-httplib2==0.0.3
google-cloud-bigquery==1.6.0
google-cloud-core==0.28.1
google-cloud-logging==1.8.0
google-cloud-storage==1.13.0
google-resumable-media==0.3.1
googleapis-common-protos==1.5.3
httplib2==0.11.3
oauthlib==2.1.0
在@马克·法加斯您可以看看GitHub上的googleapis/googleauth库pythonlibrary。您将找到与所讨论方法相关的一些信息:
凭证被认为是不可变的。如果要修改作用域 或用于委派的主题,使用:meth:
with_scopes
或 :方法:with_subject
: 作用域的\u凭据=凭据。带\u作用域([“电子邮件”]) 委派的\u凭据=证书。与_主题(主题)当您使用“GOOGLE_Application_Credentials”定义应用程序默认凭据时,您将获得google.auth.service_帐户.Credentials,其具有with\u subject方法。在
在appengine上时,您将得到一个app_engine.Credentials的实例,该实例没有with_subject方法。这解释了观察到的行为和您看到的错误。在
根据域范围委派的documentation,只有服务帐户凭据可以具有域范围的委派。在
确实不能将}的服务帐户标识来构建新的凭据。一个详细的指南可以找到here,但我也将在下面解释这个过程。在
with_subject
方法与GAE或GCE凭据一起使用。然而,有一个解决办法,我能够在我的GCE服务器上工作,我假设这也适用于GAE默认服务帐户。解决方案是使用具有所需的subject
和{首先,服务帐户需要权限来为自己创建服务帐户令牌。这可以通过转到projects
IAM and admin > Service accounts
页面来完成(确保信息面板可见,可以从右上角进行切换)。复制服务帐户电子邮件地址,并通过勾选复选框选择有问题的服务帐户。现在信息面板应该有ADD MEMBER
按钮。单击它并将服务帐户电子邮件粘贴到New members
文本框。单击Select role
下拉列表并选择角色Service Accounts -> Service Account Token Creator
。您可以检查是否使用以下gcloud
命令分配了角色:现在来看看实际的Python代码。这个例子是对上面链接的文档的一点修改。在
^{pr2}$如果使用服务帐户文件的路径设置了
GOOGLE_APPLICATION_CREDENTIALS
环境变量,try
块将不会失败。如果应用程序在Google云上运行,则会有一个AttributeError
,它是通过创建具有正确的subject
和scopes
的新凭证来处理的。在您还可以将
None
作为subject
传递给delegated_credentials
函数,它创建没有委派的凭证,因此可以使用此函数进行委派或不委派。在相关问题 更多 >
编程相关推荐