Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不将服务帐户JSON保存到磁盘的情况下验证google.storage.Client_Python_Json_Google Cloud Platform_Google Cloud Storage - Fatal编程技术网

Python 在不将服务帐户JSON保存到磁盘的情况下验证google.storage.Client

Python 在不将服务帐户JSON保存到磁盘的情况下验证google.storage.Client,python,json,google-cloud-platform,google-cloud-storage,Python,Json,Google Cloud Platform,Google Cloud Storage,对于Google云平台存储客户端的身份验证,我不希望将服务帐户JSON(您创建的凭据文件)写入磁盘。在从所有云实例共享的Hashicorp Vault密钥库加载它们之后,我希望将它们完全保存在内存中。有没有办法直接传递JSON凭据,而不是传递类似路径的/file对象 我知道如何使用pathlike/file对象执行此操作,如下所示,但这正是我想要避免的(由于安全问题,我宁愿永远不要将它们写入磁盘): 从google.cloud导入存储 #设置依赖于JSON文件的环境变量 导出GOOGLE_应用程

对于Google云平台存储客户端的身份验证,我不希望将服务帐户JSON(您创建的凭据文件)写入磁盘。在从所有云实例共享的Hashicorp Vault密钥库加载它们之后,我希望将它们完全保存在内存中。有没有办法直接传递JSON凭据,而不是传递类似路径的/file对象

我知道如何使用pathlike/file对象执行此操作,如下所示,但这正是我想要避免的(由于安全问题,我宁愿永远不要将它们写入磁盘):

从google.cloud导入存储
#设置依赖于JSON文件的环境变量
导出GOOGLE_应用程序_凭据=“/path/to/service_account.json”
#创建客户端(假定设置了环境变量)
client=storage.client()
#或者,可以在不使用环境的情况下创建客户机
#变量,但这仍然依赖于JSON文件。
client=storage.client.from_service_account_json(“/path/to/service_account.json”)
我曾试图通过直接引用JSON数据(JSON_数据)来解决这个问题,但这会引发错误:
TypeError:expected str、bytes或os.PathLike对象,而不是dict

json_data={..[json]..}
client=storage.client.from_service_account_json(json_数据)
还有,转储到JSON,但我得到了错误:

将io.open(json\u凭证\u路径,“r”,encoding=“utf-8”)作为json\u-fi:
OSError:[Errno 63]文件名太长:“{”类型“:“服务帐户”、“项目id”…

json_data={..[json]..}
client=storage.client.from_service_account_json(json.dumps(json_数据))
根据@johnhanley的建议,我也尝试过:

从google.cloud导入存储
从google.oauth2导入服务_帐户
json_data={…从密钥库加载的数据…}
类型(json_数据)
字典
凭据=服务\帐户。凭据。来自\服务\帐户\信息(json \数据)
类型(凭证)
google.oauth2.service_account.Credentials
客户端=存储。客户端(凭据=凭据)
这导致DefaultCredentials错误:

引发异常。DefaultCredentialsError(\u帮助\u消息)
google.auth.exceptions.DefaultCredentialsError:无法自动确定凭据。请设置google_应用程序_凭据或显式创建凭据并重新运行应用程序。有关详细信息,请参阅https://developers.google.com/accounts/docs/application-default-credentials.


如果您对如何解决这个问题有什么想法,我很乐意听听!

目前,云存储的客户端库中没有内置的方法来实现这一点。因此,这里有两种可能:

  • 正如@JohnHanley所述,使用提供的内置方法为云存储客户端创建构造函数

  • >P>您不妨考虑使用另一个产品,例如或允许您在服务级别配置身份验证,并且避免提供服务帐户凭据。


1)您在哪里运行此代码?2)如果您不想在磁盘上存储JSON密钥材料,您将在哪里存储JSON密钥材料?不要用一个安全漏洞换另一个。3)使用JSON密钥材料使用
credentials=service\u account.credentials.from\u service\u account\u info(service\u account\u info)
storage.Client(credentials=credentials)
Docs:and@JohnHanley,我正在内存中存储关键材料(从Hashicorp Vault中读取后)。@JohnHanley,我尝试了上面概述的内容,但出现了以下错误,似乎与文档一致。(这是一个范围严格的存储服务帐户)。下面是错误:`raiseexceptions.DefaultCredentialsError(\u HELP\u消息)google.auth.exceptions.DefaultCredentialsError:无法自动确定凭据。请设置google_APPLICATION_凭据或显式创建凭据并重新运行应用程序。有关详细信息,请参阅。'此错误表示您没有正确实现我建议的代码。请参阅我提供的文档链接。你在哪里运行这段代码(一个谷歌计算服务,在GCP之外,等等)。@JohnHanley,这段代码在本地开发人员机器上运行,但最终将在计算支持实例(可能是任何云)的容器中运行。