我们在使用服务帐户访问转售商API方面存在问题。客户秘密的示例效果很好,但是我们需要在K8S(Kubernetes Engine(中部署此示例,而无需经常刷新OAuth会话(尤其是一次这样做,因为在Docker容器中有点困难(。
虽然有很多关于如何使用Python进行此操作的文档,但我们找不到使用服务帐户获得访问的任何方法。
我们尝试了两个帐户,即默认计算引擎一个,一个直接为我们的用例创建的帐户。
都有经销商范围。 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上阅读了一篇文章,转销商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@resseller.example.com等(,他们有权致电转销商API。li>
- 您可以使用常规的3腿OAuth而不是服务帐户。您只需要确保请求离线访问,以便获得长期以来寿命的刷新令牌。
- 模仿/域范围内委托与默认服务帐户与附录和Computeengine内置不兼容。您必须使用您在API项目中创建的服务帐户。
看看Google提供的样本是否可以让您获得您需要的地方。
通过使用其他配置解决了问题,然后设置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)
}