10

Google API 客户端通常会识别GOOGLE_APPLICATION_CREDENTIALS环境变量。如果找到,它应该指向一个 JSON 文件,其中包含服务帐户或用户的凭据。

可以从 GCP 网络控制台下载服务帐户凭据,如下所示:

{
  "type": "service_account",
  "project_id": "...",
  "private_key_id": "...",
  "private_key": "...",
  "client_email": "...",
  "client_id": "...",
  "auth_uri": "...",
  "token_uri": "...",
  "auth_provider_x509_cert_url": "...",
  "client_x509_cert_url": "..."
}

用户凭据通常可用,~/.config/gcloud/application_default_credentials.json如下所示:

{
  "client_id": "...",
  "client_secret": "...",
  "refresh_token": "...",
  "type": "authorized_user"
}

这是官方 google ruby​​gem检测通过环境 var 提供的凭据类型的示例。

我想使用两种类型的凭据对未配置的 gcloud 安装进行身份验证。在我们的例子中,我们碰巧将GOOGLE_APPLICATION_CREDENTIALS变量和路径传递到 docker 容器中,但我认为这对于 docker 外部的全新安装也是一个有效的问题。

如果凭证文件是服务帐户类型,我可以这样做:

gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS}

但是,我看不到任何方法来处理凭据属于真实用户的情况。

问题:

  1. 为什么官方 gcloud 工具不遵循其他 google API 客户端使用和使用GOOGLE_APPLICATION_CREDENTIALS时可用的约定?
  2. 是否有隐藏方法可以激活用户凭据案例?
4

2 回答 2

4

正如您指出的那样,gcloud命令行工具 (CLI) 不使用应用程序默认凭据。它有单独的系统来管理自己的凭据。

GOOGLE_APPLICATION_CREDENTIALS是为客户端库设计的,以简化凭据中的连接,而 gcloud CLI 不是库。即使在客户端代码中,最佳实践也不依赖于此环境变量,而是显式提供凭据。

要回答您的第二个问题,可以通过以下方式获取用户凭据

gcloud auth login

命令。(注意这与 不同gcloud auth application-default login)除了保存实际凭据之外,还将account在当前配置中设置属性:

 gcloud config list

gcloud可以有许多配置,每个配置都有不同的凭据。看

gcloud config configurations list

您可以创建多个配置,一个使用用户帐户,另一个使用服务帐户,并通过提供参数同时使用它--configuration,例如

gcloud compute instances list --configuration MY_USER_ACCOUNT_CONFIG

同样,您也可以通过使用--account标志切换使用哪些凭据,在这种情况下它将使用相同的配置并且只会换出帐户。

于 2018-07-09T19:22:33.970 回答
0

GOOGLE_APPLICATION_CREDENTIALS当指向具有用户凭据而不是服务帐户凭据的文件时,我找到了一种对新 gcloud 进行身份验证的方法。

cat ${GOOGLE_APPLICATION_CREDENTIALS}
{
 "client_id": "aaa",
 "client_secret": "bbb",
 "refresh_token": "ccc",
 "type": "authorized_user"
}

gcloud config set auth/client_id aaa                                                                                             
gcloud config set auth/client_secret bbb                                                                                     
gcloud auth activate-refresh-token user ccc

这使用了未记录的auth activate-refresh-token子命令 - 这并不理想 - 但它确实有效。

与 搭配使用时gcloud auth activate-service-account --key-file=credentials.json,无论在$GOOGLE_APPLICATION_CREDENTIALS

于 2018-07-11T12:34:23.100 回答