我可以使用服务帐户和用户凭据对 gcloud cli 进行身份验证吗?
Can I authenticate gcloud cli using both service account and user credentials?
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"
}
下面是官方googlerubygemdetecting 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}
但是我看不出有什么方法可以处理凭据属于真实用户的情况。
问题:
- 为什么官方 gcloud 工具不遵循其他 google API 客户端使用的约定并在可用时使用
GOOGLE_APPLICATION_CREDENTIALS
?
- 是否有隐藏方法可以激活用户凭据案例?
正如您所指出的 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
标志来切换使用哪些凭据,在这种情况下,它将使用相同的配置并且只会换出帐户。
当 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
可用的凭据类型如何,都可以初始化 gcloud
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"
}
下面是官方googlerubygemdetecting 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}
但是我看不出有什么方法可以处理凭据属于真实用户的情况。
问题:
- 为什么官方 gcloud 工具不遵循其他 google API 客户端使用的约定并在可用时使用
GOOGLE_APPLICATION_CREDENTIALS
? - 是否有隐藏方法可以激活用户凭据案例?
正如您所指出的 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
标志来切换使用哪些凭据,在这种情况下,它将使用相同的配置并且只会换出帐户。
当 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