我可以同时使用服务帐户和用户凭据来认证gcloud cli吗?

时间:2018-07-09 10:03:54

标签: gcloud gcloud-cli

Google API客户端通常可以识别GOOGLE_APPLICATION_CREDENTIALS环境变量。如果找到,则期望它指向带有服务帐户或用户凭据的JSON文件。

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

{
  "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官方的rubygem detecting the type of credentials provided via the environment 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. 是否有一个隐藏的方法可以激活用户凭证的情况?

2 个答案:

答案 0 :(得分:0)

正如您指出的那样, <div id="total" class="mr-5">Total tests: <script type="text/javascript"> myfunction(); </script></div> <div id="failed" class="mr-5">Failed tests:</div> <div id="passed" class="mr-5">Passed tests:</div> <span id="runTime" class="float-right"><div class="mr-5">Run Time:</div></span> 命令行工具(CLI)不使用应用程序默认凭据。它具有用于管理自己的凭据的独立系统。

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

要回答第二个问题,可以通过获取用户凭据

GOOGLE_APPLICATION_CREDENTIALS

命令。 (请注意,这与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 标志来切换使用哪些凭据,在这种情况下,它将使用相同的配置,并且只会换出该帐户。

答案 1 :(得分:-1)

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配对,这使得初始化gcloud成为可能,而与$GOOGLE_APPLICATION_CREDENTIALS上可用的凭据类型无关。