这是我见过的唯一具有这样行为的 API。
设置
export GOOGLE_APPLICATION_CREDENTIALS=mykey
有效,但执行 gcloud auth activate-service-account --key-file=mykey
然后执行我的代码,我看到一个权限错误:
google.api_core.exceptions.PermissionDenied: 403 Request had insufficient authentication scopes. [reason: "ACCESS_TOKEN_SCOPE_INSUFFICIENT"
domain: "googleapis.com"
metadata {
key: "service"
value: "analyticsadmin.googleapis.com"
}
metadata {
key: "method"
value: "google.analytics.admin.v1alpha.AnalyticsAdminService.ListAccessBindings"
}
]
这是我的代码:
client = AnalyticsAdminServiceClient(transport=None)
res = client.list_access_bindings(parent=f"accounts/{account}")
我使用的所有其他 API 都尊重激活的服务帐户。这个API真的只支持设置环境变量吗?
这令人困惑,但行为是正确的。
gcloud
身份验证和 应用程序默认凭据 相似但不同。
请参阅搜索顺序了解应用程序默认凭据。
假设您在云外运行,当您取消设置
GOOGLE_APPLICATION_CREDENTIALS
时,代码的凭据是应用程序默认凭据中的用户凭据。
该错误是由于您的应用程序默认凭据(在 Linux 上:
${HOME}/.config/gcloud/application_default_credentials.json
)不足而导致的。
gcloud
但是不是您的代码未通过服务帐户身份验证。
这里的解决方案是在云外运行时使用
GOOGLE_APPLICATION_CREDENTIALS
。
当您的代码在 Google 计算服务上运行时,您可以保留
GOOGLE_APPLICATION_CREDENTIALS
未设置并信任元数据服务向代码提供计算服务的服务帐户凭据。