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

Load JSON file's content to Heroku's environment variable

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

这是我的服务帐户 json 文件的快照:

我尝试通过 运行

设置 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 文件的绝对路径) 。我找到了一种无需加载 json 帐户即可授权开发者帐户的方法,而是使用 GOOGLE_ACCOUNT_TYPEGOOGLE_CLIENT_EMAILGOOGLE_PRIVATE_KEYHere 是它的 GitHub 讨论页面。

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

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

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

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

编辑: 假设您使用的是 google 官方客户端库,您有几个选项来验证您的请求,包括您正在使用(服务帐户):https://googlecloudplatform.github.io/google-cloud-python/latest/core/auth.html You may save your credentials to the temp file and pass it's path to the Client object https://google-auth.readthedocs.io/en/latest/user-guide.html#service-account-private-key-files(但在我看来,这是一个非常 hacky 的解决方法).您还可以使用其他几个身份验证选项。

编辑2: 我又找到了一个 link 更稳健的方法 http://codrspace.com/gargath/using-google-auth-apis-on-heroku/。有 ruby 代码,但您肯定可以在 Python 中做类似的事情。

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

解决方案 1:

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

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

解决方案 2:

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

Node.js中的示例:

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