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": "..."
}
Run Code Online (Sandbox Code Playgroud)
用户凭据通常可用~/.config/gcloud/application_default_credentials.json
,如下所示:
{
"client_id": "...",
"client_secret": "...",
"refresh_token": "...",
"type": "authorized_user"
}
Run Code Online (Sandbox Code Playgroud)
这是官方 google rubygem检测通过环境 var 提供的凭据类型的示例。
我想使用两种类型的凭据对未配置的 gcloud 安装进行身份验证。在我们的例子中,我们碰巧将GOOGLE_APPLICATION_CREDENTIALS
变量和路径传递到 docker 容器中,但我认为这对于 docker 外部的干净安装也是一个有效的问题。
如果凭据文件是服务帐户类型,我可以这样做:
gcloud auth activate-service-account --key-file=${GOOGLE_APPLICATION_CREDENTIALS}
Run Code Online (Sandbox Code Playgroud)
但是,我看不到任何方法来处理凭据属于真实用户的情况。
问题:
GOOGLE_APPLICATION_CREDENTIALS
在可用时使用?我正在尝试获取一个服务帐户,以便从 Python 脚本中在 Google Cloud Storage 中创建 blob,但我遇到了凭据问题。
1) 我为我的项目创建服务帐户,然后下载 json 格式的密钥文件:
"home/user/.config/gcloud/service_admin.json"
Run Code Online (Sandbox Code Playgroud)
2)我为服务帐户提供必要的凭据(通过子流程中的 gcloud)
roles/viewer, roles/storage.admin, roles/resourcemanager.projectCreator, roles/billing.user
Run Code Online (Sandbox Code Playgroud)
然后我想访问GCS中的一个bucket
from google.cloud import storage
import google.auth
credentials, project = google.auth.default()
client = storage.Client('myproject', credentials=credentials)
bucket = client.get_bucket('my_bucket')
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会导致:
google.api_core.exceptions.Forbidden: 403 GET
https://www.googleapis.com/storage/v1/b/my_bucket?projection=noAcl:
s_account@myproject.iam.gserviceaccount.com does not have
storage.buckets.get access to my_bucket
Run Code Online (Sandbox Code Playgroud)
如果我设置环境变量,我的运气会更好一些
export GOOGLE_APPLICATION_CREDENTIALS="home/user/.config/gcloud/service_admin.json"
Run Code Online (Sandbox Code Playgroud)
并重新运行脚本。但是,我希望这一切都在创建帐户的脚本的一个实例中运行,并继续在存储桶中创建必要的文件。如果我知道我的 json 凭证文件在哪里,如何访问 my_bucket。
google-cloud-storage google-cloud-platform google-cloud-python