使用服务帐户访问Google转售商API

时间:2018-04-25 19:00:08

标签: go google-admin-sdk google-reseller-api

我们在使用服务帐户访问转销商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,我找不到任何记录的方法。

2 个答案:

答案 0 :(得分:1)

这里几点:

  • 转销商API仅在使用服务帐户时才需要模拟/域范围委派。换句话说,服务帐户本身无权直接调用API,但它确实能够模拟有权调用经销商API的经销商用户(例如admin@reseller.example.com等)。
  • 您可以use regular 3-legged OAuth而不是服务帐户。您只需确保请求脱机访问,以便获得长期使用的刷新令牌。
  • 模拟/域范围委派与AppEngine和ComputeEngine内置的默认服务帐户不兼容。您必须使用在API项目中创建的服务帐户。

看看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)
}