将JSON文件的内容加载到Heroku的环境变量中

hul*_*ain 8 django heroku environment-variables google-authentication google-speech-api

我在我的Django网络应用程序中使用Google Speech API.我已经为它设置了一个服务帐户,并且能够在本地进行API调用.我已将本地GOOGLE_APPLICATION_CREDENTIALS环境变量指向服务帐户的json文件,该文件包含所有凭据.

这是我的服务帐户的json文件的快照: 在此输入图像描述

我试过GOOGLE_APPLICATION_CREDENTIALS通过运行来设置heroku的环境变量

$ heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< myProjCreds.json)"

$ heroku config
GOOGLE_APPLICATION_CREDENTIALS: {
Run Code Online (Sandbox Code Playgroud)

^^它"在json文件的第一次出现时终止,紧接在{ 和之后

$ heroku config:set GOOGLE_APPLICATION_CREDENTIALS='$(< myProjCreds.json)'

$ heroku config
GOOGLE_APPLICATION_CREDENTIALS: $(< myProjCreds.json)
Run Code Online (Sandbox Code Playgroud)

^^该命令被保存到环境变量中

我尝试将heroku的GOOGLE_APPLICATION_CREDENTIALSenv变量设置为服务帐户的json文件的内容,但它不起作用(因为显然此变量的值必须是json文件的绝对路径).我发现它授权一个开发者账户,而无需加载JSON户头,而使用的方法GOOGLE_ACCOUNT_TYPE,GOOGLE_CLIENT_EMAILGOOGLE_PRIVATE_KEY.是GitHub的讨论页面.

我想为我的Django网络应用程序提供类似(或不同的东西)的东西,我想避免将json文件上传到我的Django web-app的目录(如果可能),以确保安全.

bro*_*lav 3

根据您使用哪个库与 Speech API 通信,您可以使用多种方法:

  1. 您可以使用 base64 或类似的方式序列化 JSON 数据,并将结果字符串设置为一个环境变量。在应用程序启动期间,您可以解码此数据并适当配置您的客户端库。

  2. 您可以将凭据文件中的每一对设置为单独的环境变量并相应地使用它们。也许您正在使用的库支持使用 进行身份验证GOOGLE_ACCOUNT_TYPEGOOGLE_CLIENT_EMAIL并且GOOGLE_PRIVATE_KEY类似于您链接到的 ruby​​ 客户端。

编辑: 假设您正在使用谷歌官方客户端库,您有多种选项来验证您的请求,包括您正在使用(服务帐户): https: //googlecloudplatform.github.io/google-cloud-python/latest/core /auth.html您可以将凭据保存到临时文件并将其路径传递给客户端对象https://google-auth.readthedocs.io/en/latest/user-guide.html#service-account-private-key -files(但在我看来,这是一个非常hacky的解决方法)。您还可以使用其他几个身份验证选项。

EDIT2: 我发现了另一个具有更强大方法的链接http://codrspace.com/gargath/using-google-auth-apis-on-heroku/。有 ruby​​ 代码,但你肯定可以在 Python 中做类似的事情。

  • 是的,存在一种方法“service_account.Credentials.from_service_account_info(cls=JSONfileContent,scopes=scopes)”,我可以在其中通过在可以从环境中获取的 b64encoded* 字符串上使用“json.loads()”来输入 jsonFileContent *多变的!此方法返回可以进一步使用的凭据。非常感谢您改进您的答案,此方法似乎是设置环境变量的最佳替代方法。干杯! 请随意在您的答案中包含这行代码:D (2认同)