我们在使用服务帐户访问代理商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"尽管使用时我们总是出错
"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和客户端库库都无法找到实现此目的的方法。Python就像端对端教程中所述
credentials = ServiceAccountCredentials.from_json_keyfile_name( JSON_PRIVATE_KEY_FILE, OAUTH2_SCOPES).create_delegated(RESELLER_ADMIN_USER)
但是对于Go,我找不到任何记录的方式来执行此操作。
通过使用其他配置解决了问题,然后设置了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) }