我们在使用服务帐户访问转销商API时遇到问题。 具有客户端机密的示例运行良好,但是我们需要在k8s(Kubernetes Engine)中部署它,而不需要定期刷新oauth会话(特别是这样做一次,因为它在docker容器中有点难)。
虽然有很多关于如何使用python执行此操作的文档,但我们找不到使用服务帐户访问的任何方法。
我们尝试了两个帐户,默认计算引擎一个,一个直接为我们的用例创建。 两者都获得了G Suite的经销商范围。
https://www.googleapis.com/auth/apps.order,
https://www.googleapis.com/auth/admin.directory.user,
https://www.googleapis.com/auth/siteverification,
我们在使用
时遇到"googleapi: Error 403: Authenticated user is not authorized to perform this action., insufficientPermissions"
错误
client, err = google.DefaultClient(ctx, reseller.AppsOrderScope)
if err != nil {
log.Fatal("creating oauth client failed", zap.Error(err))
}
subs, err := client.Subscriptions.List().Do()
if err != nil {
log.Fatal("listing subscriptions failed", zap.Error(err))
}
我在StackOverflow上的一篇文章中读到,Reseller API需要用户模仿,但在整个Google和oauth2以及客户端lib repos上进行搜索并不会导致这样做。 Python就像在端到端教程
中描述的那样 credentials = ServiceAccountCredentials.from_json_keyfile_name(
JSON_PRIVATE_KEY_FILE,
OAUTH2_SCOPES).create_delegated(RESELLER_ADMIN_USER)
但对于Go,我找不到任何记录的方法。
答案 0 :(得分:1)
这里几点:
看看the samples Google provides能否找到你需要的地方。
答案 1 :(得分:1)
通过使用不同的配置然后设置显然冒充的jwt.Subject来解决问题:
const envVar = "GOOGLE_APPLICATION_CREDENTIALS"
if filename := os.Getenv(envVar); filename != "" {
serviceAccount, err := ioutil.ReadFile(filename)
if err != nil {
log.Fatal("creating oauth client failed", zap.Error(err))
}
config, err := google.JWTConfigFromJSON(serviceAccount,
reseller.AppsOrderScope,
)
config.Subject = *impersonationUser // like user@google.com
client = config.Client(ctx)
}