使用Google Cloud Service帐户密钥文件

时间:2017-06-17 01:23:46

标签: node.js heroku google-cloud-platform

我有一个网络应用程序,我尝试使用Heroku进行部署。我使用Google Cloud Node.js库来访问Google云端存储。我的服务器文件顶部有以下内容:

const gcs = require('@google-cloud/storage')({
  projectId: 'my-project-ID',
  credentials: process.env.GCS_KEYFILE
});

GCS_KEYFILE是我使用Heroku命令行工具使用heroku config:set GCS_KEYFILE="$(< /my/file.json)"

设置的配置变量

检查仪表板以确保已确认JSON文件的内容已设置为config var。屏幕截图如下所示: enter image description here

当我尝试使用gcs执行任何操作时出现的错误是:

Error: Could not authenticate request 
The incoming JSON object does not contain a client_email field

这没有任何意义,因为它显然有效。 json本身很好;我直接从Google Cloud下载了该下载而未对其进行修改。我尝试在keyFileName声明中使用const gcs,但我收到了ENAMETOOLONG错误(加上the docs say用于指定JSON文件路径的错误)。当我使用keyFileName并指定JSON文件的路径时,它在本地工作,因此我非常确定JSON本身不是问题。

关于我为什么会收到此错误的任何想法?或者是否有更好的方法在Heroku上处理来自Google的JSON Keyfiles?

2 个答案:

答案 0 :(得分:5)

heroku或任何地方的环境变量都是字符串。

如果谷歌api构造函数采用JSON对象,您可能需要执行类似的操作将其转换回JSON:

const gcs = require('@google-cloud/storage')({
  projectId: 'my-project-ID',
  credentials: JSON.parse(process.env.GCS_KEYFILE)
});

答案 1 :(得分:1)

为此有一个有用的heroku buildpack

heroku buildpacks:add --index 1 https://github.com/buyersight/heroku-google-application-credentials-buildpack.git

--index 1是因为“应用程序主要语言的构建包应该是最后添加的构建包”,因此,如果您有其他构建包,请注意这一点。