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

时间:2018-02-18 18:12:59

标签: django heroku environment-variables google-authentication google-speech-api

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

这是我的服务帐户的json文件的快照: enter image description here

我尝试通过运行

设置heroku的GOOGLE_APPLICATION_CREDENTIALS环境变量
$ heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(< myProjCreds.json)"

$ heroku config
GOOGLE_APPLICATION_CREDENTIALS: {

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

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

$ heroku config
GOOGLE_APPLICATION_CREDENTIALS: $(< myProjCreds.json)

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

我尝试将heroku的GOOGLE_APPLICATION_CREDENTIALS env变量设置为服务帐户的json文件的内容,但它不起作用(因为显然此变量的值必须是json文件的绝对路径)< / em>。我发现了一种方法,可以在不加载json accout的情况下授权开发者帐户,而不是使用GOOGLE_ACCOUNT_TYPEGOOGLE_CLIENT_EMAILGOOGLE_PRIVATE_KEYHere是GitHub的讨论页面。

我想为我的Django网络应用程序提供类似(或不同的东西)的内容,我想避免将json文件上传到我的Django网络应用程序目录(如果可能),以防出于安全原因。

2 个答案:

答案 0 :(得分:3)

根据您用于与Speach API通信的库,您可以使用以下几种方法:

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

  2. 您可以将凭证文件中的每一对设置为单独的env变量,并相应地使用它们。也许您使用GOOGLE_ACCOUNT_TYPEGOOGLE_CLIENT_EMAILGOOGLE_PRIVATE_KEY使用支持身份验证的库类似于您要链接到的ruby客户端。

  3. 修改 假设您使用的是谷歌官方客户端库,您有多种选项可用于验证您的请求,包括您正在使用的服务(服务帐户):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中做类似的事情。

答案 1 :(得分:0)

假设文件名是 key.json 首先,复制 key.json 文件的内容并将其添加到环境变量中,例如 KEY_DATA

解决方案 1:

如果我启动服务器的命令是 node app.js,我会执行 echo $KEY_DATA > key.json && node app.js

这将使用来自 key.json 的数据创建一个 KEY_DATA 文件,然后启动服务器。

解决方案 2:

将来自 KEY_DATA 环境变量的数据保存在某个变量中,然后将其解析为 JSON,这样您就拥有了可以传递用于身份验证目的的对象。

Node.js 中的示例:

const data = process.env.KEY_DATA;
const dataObj = JSON.parse(data);