是否有受支持的方法可以在不使用密钥文件的情况下使用 Google 云 Python SDK 对服务帐号进行身份验证?



我在 CI/CD 环境中操作,在该环境中,严禁将 JSON 密钥文件写入磁盘或将其包含在项目中。 我所能做的就是将原始 JSON 数据注入到一个环境变量中,我们可以在运行时读回该变量。 将GOOGLE_APPLICATION_CREDENTIALS设置为密钥文件路径的通常方法在这里不起作用,因为我们首先无法写入文件。 它需要将 JSON 数据直接作为字符串包含。

不幸的是,我找到的所有Google云文档都假设在身份验证之前存在JSON密钥文件。 没有讨论如何直接通过变量值进行身份验证。 我发现的最接近的东西提示显式设置凭据是可能的,但链接页面仅讨论 Credentials 类的内部属性。

幸运的是,我阅读代码比阅读文档运气更好。 在闲逛了一会儿之后,我找到了使我能够做我想做的事的ServiceAccountCredentials._from_parsed_json_keyfile。 这是我的测试代码:

import os
import json
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient import discovery
# Prepare the service object
json_data = json.loads(os.getenv("MY_CREDENTIALS_STRING"))
credentials = ServiceAccountCredentials._from_parsed_json_keyfile(json_data, scopes='')
service = discovery.build('compute', 'v1', credentials=credentials)
# Test the service object
request = service.images().list(project='my-project')
response = request.execute()
print(response)

这有效,但感觉像是黑客。 函数名称中的"_"告诉我它不是支持的 API 的一部分,并且在未来的版本中可能会消失而不会发出警告。

我没有看到实现这一目标的官方方法。 有吗?

使用类google.oauth2.service_account。成员from_service_account_info

文档:链接。 源代码:链接。

from google.oauth2 import service_account
// load from a file
// service_account_info = json.load(open('service_account.json'))
// load from system environment
service_account_info = json.loads(os.getenv("MY_CREDENTIALS_STRING"))
credentials = service_account.Credentials.from_service_account_info(service_account_info)

最新更新