如何使用 Go Google SDK 模拟用户?

问题描述

我有一个用户用来查询 Reports API。我生成了令牌并使用 google.ConfigFromJSON 方法读取了凭据。

虽然,现在我需要做同样的事情,但我需要使用服务帐户而不是用户。根据文档,我需要模拟用户,因为无法使用服务帐户调用 API(如果我错了,请纠正我)。

这是我模仿用户所做的:

impersonatedOption := option.ImpersonateCredentials("[email protected]")
credsOption := option.WithCredentialsFile("cert.json")
scopesOption := option.WithScopes(admin.AdminReportsAuditReadonlyScope)

httpClient,_,err := transport.NewHTTPClient(ctx,scopesOption,credsOption,impersonatedOption)

srv,err := admin.NewService(ctx,option.WithHTTPClient(httpClient))

但没有成功:

Get "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/login?alt=json&eventName=account_disabled_spamming&prettyPrint=false": impersonate: status code 403: 
{
  "error": {
    "code": 403,"message": "Request had insufficient authentication scopes.","status": "PERMISSION_DENIED"
  }
}

服务帐户被配置为超级管理员并且应该拥有所有权限。

解决方法

我只需要加载证书,并将 Subject 设置为能够模拟用户:

    config,err := google.JWTConfigFromJSON(b,scope...)
    config.Subject = "[email protected]"