【问题标题】:How to impersonate user using Go Google SDK?如何使用 Go Google SDK 模拟用户?
【发布时间】:2021-06-09 06:37:28
【问题描述】:

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

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

这是我模拟用户所做的:

impersonatedOption := option.ImpersonateCredentials("user@project.iam.gserviceaccount.com")
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"
  }
}

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

【问题讨论】:

  • 看起来您的服务帐户正在模拟的主题是服务帐户,而不是用户或管理员。此外,使用的服务帐户需要具有域范围委派才能模拟域中的用户。
  • 您好 Aerials,我也尝试使用用户 (email@domain.com) 并且服务帐户启用了域范围委派(带有 AdminReportsAuditReadonlyScope 角色)。尽管在域范围委派设置中,ID 指的是服务帐户,但这是否正确?

标签: go google-cloud-platform google-admin-sdk google-reporting-api


【解决方案1】:

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

    config, err := google.JWTConfigFromJSON(b, scope...)
    config.Subject = "impersonated_user@email.com"

【讨论】:

  • 您是否愿意为此分享完整的代码。我被卡住了,找不到如何实现这一目标
  • 可以,但是和上面的代码没有太大区别:play.golang.org/p/MsPMZLr9EoU
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多