我在Django网络应用中使用Google Speech API。我已经为它设置了一个服务帐户,并且能够在本地进行API调用。我已将本地GOOGLE_APPLICATION_CREDENTIALS
环境变量指向服务帐户的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文件的绝对路径)< / em>。我发现了一种方法,可以在不加载json accout的情况下授权开发者帐户,而不是使用GOOGLE_ACCOUNT_TYPE
,GOOGLE_CLIENT_EMAIL
和GOOGLE_PRIVATE_KEY
。 Here是GitHub的讨论页面。
我想为我的Django网络应用程序提供类似(或不同的东西)的内容,我想避免将json文件上传到我的Django网络应用程序目录(如果可能),以防出于安全原因。
答案 0 :(得分:3)
根据您用于与Speach API通信的库,您可以使用以下几种方法:
您可以使用base64或类似的东西序列化您的JSON数据,并将结果字符串设置为一个环境变量。在应用程序启动期间,您可以解码此数据并适当配置客户端库。
您可以将凭证文件中的每一对设置为单独的env变量,并相应地使用它们。也许您使用GOOGLE_ACCOUNT_TYPE
,GOOGLE_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中做类似的事情。
答案 1 :(得分:0)
假设文件名是 key.json
首先,复制 key.json
文件的内容并将其添加到环境变量中,例如 KEY_DATA
。
如果我启动服务器的命令是 node app.js
,我会执行 echo $KEY_DATA > key.json && node app.js
这将使用来自 key.json
的数据创建一个 KEY_DATA
文件,然后启动服务器。
将来自 KEY_DATA 环境变量的数据保存在某个变量中,然后将其解析为 JSON,这样您就拥有了可以传递用于身份验证目的的对象。
Node.js 中的示例:
const data = process.env.KEY_DATA;
const dataObj = JSON.parse(data);