是否支持使用Google Cloud Python SDK而不使用密钥文件来认证服务帐户的方法?

时间:2019-04-30 02:38:31

标签: python google-cloud-platform google-authentication

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

不幸的是,我发现的所有Google Cloud文档都假设在身份验证之前存在JSON密钥文件。没有讨论如何直接通过变量值进行身份验证。 closest thing which I've found暗示可以显式设置凭据,但是linked page仅讨论Credentials类的内部属性。

幸运的是,the code比文档要好。经过一番摸索之后,我发现了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的一部分,在以后的版本中可能会在没有警告的情况下消失。

我没有看到实现此目标的正式方法。有一个吗?

1 个答案:

答案 0 :(得分:1)

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

文档:link。 源代码:link

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)