gpt4 book ai didi

使用 Cloud Run 的内部 CLI 的 Google Cloud Auth

转载 作者:数据小太阳 更新时间:2023-10-29 03:18:02 28 4
gpt4 key购买 nike

我们使用 Cloud Run 构建了多项服务。我们的目标是构建一个内部 CLI,允许我们的开发人员调用这些服务。我们在生成 id_token 以与位于 Cloud Run 服务前面的 Identity Aware Proxy 一起使用时遇到问题。

根据文档,可以使用 gcloudgcloud auth print-identity-token 命令调用您的 Cloud Run 服务。这很好用。这也避免了必须下载服务帐户凭据并将其传递给我们的开发人员,因为此方法会利用您的应用程序默认凭据。

我们已经尝试在 Go 中实现一些东西来复制此 print-identity-token 功能,但没有成功。生成的 id_token 向我们所有的 Cloud Run API 返回 401。生成 token 的示例代码:

func GetIDToken() string {
ctx := context.Background()
tokenSource, err := google.DefaultTokenSource(ctx, "openid", "email")

if err != nil {
log.Fatal(err)
}

token, err := tokenSource.Token()

if err != nil {
log.Fatal(err)
}

return fmt.Sprintf("%v", token.Extra("id_token"))
}

这会返回一个 id_token 但它不适用于 API。根据文档,范围似乎是正确的。

这给我们留下了两个问题:

  1. 这是为 IAP 生成 Id token 的正确方法吗?
  2. 是否有更好的方法来为我们的开发人员实现对这些内部 API 的身份验证?

最佳答案

不清楚您为什么要尝试重新实现 gcloud auth print-identity-token。我强烈建议您不要尝试这样做。

如果您正在构建开发人员 CLI,如果您在开发机器中设置 gcloud 并调用此命令来检索 id_token,您的工作会容易得多。

重新实现 print-identity-token 真的很困难。因为 gcloud 使用内部 refresh_token 调用 OAuth token 端点,它一直在存储以获取 id_token 以及 access_token 。 (使用 --log-http 运行命令以查看更多信息,并将相关的 gcloud 配置设置为不编辑请求/响应正文中的 token 。)

或者,如果gcloud 不在开发人员机器上并使用 GSuite 帐户进行身份验证,您唯一的其他选择是分发 IAM 服务帐户 key 到每台开发机器。 (另一方面,您需要确保这些 key 已正确轮换并保持安全。)

您可以使用 IAM 服务帐户 key 向 https://www.googleapis.com/oauth2/v4/token 发送带有适当字段(如 client_secret、grant_type 等)的 POST id_token。我相信最简单的方法是将 Go 程序中的 GOOGLE_APPLICATION_CREDENTIALS env 变量设置为 key 文件,在 token 交换请求中指定正确的 audience 参数,然后使用 token.Extra("id_token") 正如您所做的那样。

另外:我还注意到您的身份字段在您的示例代码中未设置为 Cloud Run 服务的 URL。

关于使用 Cloud Run 的内部 CLI 的 Google Cloud Auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58072361/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com