一尘不染

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

go

我们在使用服务帐户访问代理商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和客户端库库都无法找到实现此目的的方法。Python就像端对端教程中所述

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

但是对于Go,我找不到任何记录的方式来执行此操作。


阅读 335

收藏
2020-07-02

共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)
}
2020-07-02