以编程方式获取 GCP 上的当前服务帐户

问题描述

在未设置 GOOGLE_APPLICATION_CREDENTIALS 时,是否可以通过编程方式访问 GCP 实例上当前使用的服务帐户的电子邮件(即使用认服务帐户时)

我已经查看了 GCP 文档,但是当没有设置 GOOGLE_APPLICATION_CREDENTIALS 时,only resource I found 不能与 default Service Account 一起使用。我知道可以使用 gcloud(请参阅 this SO questiondocumentation)这样做,但是这些解决方案在 ContainerOptimisedOS 上运行时不适用。我在 GCP 支持团队的帮助下花了几个星期的时间,但他们的结论是无法帮助我,并将我重定向到 StackOverflow 寻求帮助。

解决方法

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

我建议只使用一段 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?")
    }