【问题标题】:Programmatically get current Service Account on GCP以编程方式获取 GCP 上的当前服务帐户
【发布时间】:2021-01-21 05:01:04
【问题描述】:

在未设置 GOOGLE_APPLICATION_CREDENTIALS 的情况下,是否有办法以编程方式访问 GCP 实例上当前使用的服务帐户的电子邮件?(即使用默认服务帐户时)

我查看了 GCP 文档,但在未设置 GOOGLE_APPLICATION_CREDENTIALS 时,only resource I found 不能与 default Service Account 一起使用。我知道可以使用gcloud(参见this SO questiondocumentation)来做到这一点,但是这些解决方案在ContainerOptimisedOS 上运行时不适用。我与 GCP 支持团队来来回回花了几周时间,但他们得出的结论是无法帮助我,并将我重定向到 StackOverflow 寻求帮助。

【问题讨论】:

  • 通过访问服务帐户阐明您的意思。您是指服务帐户创建的名称、内容还是 OAuth 令牌? Google 客户端 SDK 将检测到您正在使用服务帐户在 Google 服务上运行。除非您正在编写自定义代码、调用 REST API 等,否则您无需做任何特别的事情。为此,您可以从元数据服务器获取访问令牌。编辑您的问题以明确说明您的目标和问题。
  • 感谢您的请求,John - 我的意思是真的:姓名、电子邮件、内容,以及任何指向正在使用的特定帐户的内容。根据要求,我编辑了问题

标签: google-cloud-platform google-compute-engine service-accounts google-cloud-iam google-container-os


【解决方案1】:

John 的解决方案在任何语言上都非常有效,无需任何外部库。但是,当部署了元数据服务器时,它仅适用于 Google Cloud 环境。您无法在您的计算机上执行此测试。

我建议只使用一段 Python 代码(使用 Google OAuth 库,但它适用于具有此库的其他语言)来询问库当前的凭据。如果凭据是服务帐户(来自您计算机上的 GOOGLE_APPLICATION_CREDENTIALS、ADC(应用程序默认凭据)或元数据服务器),您将打印电子邮件,否则,您会收到警告消息,因为您使用了您的用户帐户凭据

    import google.auth

    credentials, project_id = google.auth.default()

    if hasattr(credentials, "service_account_email"):
      print(credentials.service_account_email)
    else:
        print("WARNING: no service account credential. User account credential?")

请注意,如果使用默认服务帐户,此方法将打印 default 而不是整个电子邮件地址。


编辑 1

    ctx := context.Background()
    credential,err := google.FindDefaultCredentials(ctx)
    content := map[string]interface{}{}

    json.Unmarshal(credential.JSON,&content)
    if content["client_email"] != nil {
      fmt.Println(content["client_email"])
    } else {
      fmt.Println("WARNING: no service account credential. User account credential?")
    }

【讨论】:

  • 这个!我为你鼓掌,Guillaume,这是我所需要的,并且确实返回了正确的信息,使我能够识别使用了哪个服务帐户。我已经为您的答案添加了一个小的错字更正和一个小的澄清 - 我希望没关系。再次感谢您,我希望 GCP 支持人员能像您一样快速准确!
  • go-lang 中是否有等效的库?谢谢
  • 当然,我用 GO 代码为你更新了答案。
猜你喜欢
  • 2021-12-04
  • 2011-06-30
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多