GAE AttributeError:“Credentials”对象没有“with \u subject”属性

2024-06-09 07:01:03 发布

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

我有一个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

Tags: importbuildauth应用程序cloud部署withgoogle
2条回答

在@马克·法加斯您可以看看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,只有服务帐户凭据可以具有域范围的委派。在

确实不能将with_subject方法与GAE或GCE凭据一起使用。然而,有一个解决办法,我能够在我的GCE服务器上工作,我假设这也适用于GAE默认服务帐户。解决方案是使用具有所需的subject和{}的服务帐户标识来构建新的凭据。一个详细的指南可以找到here,但我也将在下面解释这个过程。在

首先,服务帐户需要权限来为自己创建服务帐户令牌。这可以通过转到projectsIAM and admin > Service accounts页面来完成(确保信息面板可见,可以从右上角进行切换)。复制服务帐户电子邮件地址,并通过勾选复选框选择有问题的服务帐户。现在信息面板应该有ADD MEMBER按钮。单击它并将服务帐户电子邮件粘贴到New members文本框。单击Select role下拉列表并选择角色Service Accounts -> Service Account Token Creator。您可以检查是否使用以下gcloud命令分配了角色:

gcloud iam service-accounts get-iam-policy [SERVICE_ACCOUNT_EMAIL]

现在来看看实际的Python代码。这个例子是对上面链接的文档的一点修改。在

^{pr2}$

如果使用服务帐户文件的路径设置了GOOGLE_APPLICATION_CREDENTIALS环境变量,try块将不会失败。如果应用程序在Google云上运行,则会有一个AttributeError,它是通过创建具有正确的subjectscopes的新凭证来处理的。在

您还可以将None作为subject传递给delegated_credentials函数,它创建没有委派的凭证,因此可以使用此函数进行委派或不委派。在

相关问题 更多 >