使用服务帐户访问Google分销商API

使用服务帐户访问Google分销商API,go,google-admin-sdk,google-reseller-api,Go,Google Admin Sdk,Google Reseller Api,我们在使用服务帐户访问分销商api时遇到问题。 带有客户机机密的示例工作得很好,但是我们需要在k8s(Kubernetes引擎)中部署它,而不需要反复刷新oauth会话(尤其是这样做一次,因为在docker容器中这有点困难) 虽然有很多关于如何使用python实现这一点的文档,但我们找不到任何使用服务帐户访问的方法 我们尝试了两个帐户,一个是默认的计算引擎,另一个是直接为我们的用例创建的。 他们都在G套件中获得了经销商范围 https://www.googleapis.com/auth/

我们在使用服务帐户访问分销商api时遇到问题。 带有客户机机密的示例工作得很好,但是我们需要在k8s(Kubernetes引擎)中部署它,而不需要反复刷新oauth会话(尤其是这样做一次,因为在docker容器中这有点困难)

虽然有很多关于如何使用python实现这一点的文档,但我们找不到任何使用服务帐户访问的方法

我们尝试了两个帐户,一个是默认的计算引擎,另一个是直接为我们的用例创建的。 他们都在G套件中获得了经销商范围

    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无权执行此操作,权限不足”
但在使用

    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上的一篇文章中读到,分销商API需要用户模拟,但在整个Google和oauth2以及客户端lib repos上进行搜索并没有找到这样做的方法。 Python实现了端到端教程中所述的功能

    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        JSON_PRIVATE_KEY_FILE, 
    OAUTH2_SCOPES).create_delegated(RESELLER_ADMIN_USER)
但对于围棋,我找不到任何有文件证明的方法。

这里有几点:

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

查看是否可以让您到达需要的位置。

通过使用不同的配置,然后设置显然进行模拟的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)
}

据我所知,三条腿是没有选择的。其余的我们已经知道了,但似乎缺乏关于如何使用golang客户端libswy模拟用户的信息。为什么三条腿不是一个选项?因为应用程序部署在kubernetes中,当在stdin上被询问时,我无法向其提供auth令牌(或者我有什么错误吗?)您将提供刷新令牌,该令牌可以随时交换为新的访问令牌