卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章64334本站已运行4115

如何使用上传(未生成)的服务帐户密钥向 GCP 进行身份验证?

如何使用上传(未生成)的服务帐户密钥向 gcp 进行身份验证?

php小编草莓为您详细介绍如何使用上传的服务账户密钥进行Google Cloud Platform(GCP)的身份验证。在使用GCP的过程中,身份验证是非常重要的一步,而服务账户密钥则是进行身份验证的关键。本文将向您解释如何上传服务账户密钥并正确地进行身份验证,以便您能够顺利使用GCP的各项功能和服务。无论您是初次接触GCP还是已经有一定经验,本文都将为您提供有用的指导和技巧,确保您能够轻松地完成身份验证的过程。阅读本文,您将了解到上传服务账户密钥的步骤和注意事项,以及如何在GCP中正确使用这些密钥进行身份验证。

问题内容

我正在编写一项服务,需要不同租户访问 GCP 服务。 我的微服务将在不同的主机上运行(无 GCP)。 我面临的限制之一是使用服务帐户密钥授权 api 调用。 第二个约束是我的微服务负责为服务帐户生成密钥对并与租户共享公钥,以便他们可以将其上传到他们的服务帐户。

我当前的问题是,我找不到任何文档来解释如何使用我拥有的密钥对对 GCP golang 库进行身份验证。我读过的所有文档始终解决服务帐户密钥身份验证问题,假设您将让 GCP 为您生成密钥对,并且您已经拥有包含所需所有详细信息的 json 文件。

我审阅过的文档:

- https://cloud.google.com/docs/authentication/client-libraries#adc
- https://cloud.google.com/docs/authentication#service-accounts
- https://cloud.google.com/docs/authentication/provide-credentials-adc#local-key
- https://github.com/GoogleCloudPlatform/golang-samples/blob/main/auth/id_token_from_service_account.go

Google 图书馆使用一种名为“应用程序默认凭据”的机制,可让其所有图书馆找到用于身份验证的凭据。具体来说,在这种情况下,ADC 始终需要 json 文件才能获取凭据的详细信息。

json 文件如下所示:

{
    "type": "service_account",
    "project_id": "my-project",
    "private_key_id": "1ed3aae07f98f3e6da78ad308b41232133d006cf",
    "private_key": "-----BEGIN PRIVATE KEY-----n...==n-----END PRIVATE KEY-----n",
    "client_email": "<EMAIL HERE>",
    "client_id": "1234567890102",
    "auth_uri": "<GOOGLE AUTH URI HERE>",
    "token_uri": "<GOOGLE TOKEN URI HERE>",
    "auth_provider_x509_cert_url": "<SOME GOOGLE URL HERE>",
    "client_x509_cert_url": "<MORE GOOGLE URL HERE>",
    "universe_domain": "googleapis.com"
}

所以我的问题是,如何从生成的密钥对构建这个 json 文件? 如果这是不可能的(GCP 限制),那么为什么我能够上传密钥对? 有没有人可以指出我的例子来帮助我解决这种情况?

非常感谢任何帮助

我已经查看了所有 GCP 官方文档、API 参考和 Github 脚本示例。它们都没有引用上传的服务帐户密钥

解决方法

花了一些时间才回到这个问题。感谢 @guillaume-blaquiere 的回答,我开始使用最少的所需文件进行测试。

最后想出了这个:

{
  "type": "service_account",
  "private_key": "<Your generated private_key.pem>",
  "client_email": "<service account email>",
}

这些是 Google SDK 成功通过 GCP 身份验证所需的最低属性

私钥必须是用于生成上传到 GCP 服务帐号的公钥的私钥。

就golang代码而言,可以将这些信息放入一个结构体中,然后将该结构体解析为json:

type JSONFile struct {
  Type     string `json:"type"`
  PrivKey  []byte `json:"private_key"`
  Email    string `json:"client_email"`
}

然后:

file := JSONFile{
    Type:        "service_account",
    PrivKey:  "<PK bytes here>",
    Email: "[email protected]",
}
result, err := json.Marshal(file)
if err != nil {
    panic(1)
}
credentials, err := google.CredentialsFromJSON(context.Background(), result, secretmanager.DefaultAuthScopes()...)
if err != nil {
    panic(1)
}
projectsClient, err := resourcemanager.NewProjectsClient(context.Background(), option.WithCredentials(credentials))
卓越飞翔博客
上一篇: Windows 上的 Age Go 驱动程序错误:函数age_prepare_cypher(未知,未知)不存在
下一篇: 如何使用mongodb进行离线开发?
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏