2

我们在使用服务帐户访问经销商 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 存储库中搜索此内容并没有找到执行此操作的方法。Python 这样做就像端到端教程中描述的那样

    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        JSON_PRIVATE_KEY_FILE, 
    OAUTH2_SCOPES).create_delegated(RESELLER_ADMIN_USER)

但是对于 Go,我找不到任何记录在案的方法。

4

2 回答 2

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)
}
于 2018-05-02T12:45:27.713 回答
1

这里有几点:

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

看看Google 提供的示例是否能帮助您到达需要的地方。

于 2018-04-26T13:33:03.443 回答