我正在寻找将一个Node应用程序部署到Heroku,而我遇到的主要挑战与Node的Google默认授权工作流程有关。默认情况下,Google会查找带有密钥的JSON文件,其中GOOGLE_APPLICATION_CREDENTIALS
作为指向此JSON文件路径的环境变量名称。这对于本地开发来说很好,但在生产中我自然不希望将这个敏感的JSON文件提交到源代码。 Heroku允许您创建环境变量,但每个变量都是个体的。不知何故,我需要将这个JSON文件分解为单独的变量,但我不知道如何将它们称为Google以识别它们。
There is a similar thread on this for Ruby,但等效在Node中不起作用。
答案 0 :(得分:9)
使用谷歌翻译api时,我遇到了同样的问题。我无法引用整个JSON文件,因此我在Heroku中创建了两个env变量,并在凭证对象中引用它们。你不能让他们孤立无援。私钥的.replace是一个重要的细节。你应该像Heroku一样粘贴那个完整的密钥。
const Translate = require('@google-cloud/translate');
const projectId = 'your project id here';
const translate = new Translate({
projectId: projectId,
credentials: {
private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'),
client_email: process.env.GOOGLE_CLIENT_EMAIL
}
});
答案 1 :(得分:3)
getApplicationDefault
方法实际上只是一个寻找合适客户的便利工厂。您实际上可以construct your client directly传递从environmental variables defined in Heroku读取的参数。
以我最近使用Heroku部署的这个例子为例:
const GoogleAuth = require('google-auth-library');
function authorize() {
return new Promise(resolve => {
const authFactory = new GoogleAuth();
const jwtClient = new authFactory.JWT(
process.env.GOOGLE_CLIENT_EMAIL, // defined in Heroku
null,
process.env.GOOGLE_PRIVATE_KEY, // defined in Heroku
['https://www.googleapis.com/auth/calendar']
);
jwtClient.authorize(() => resolve(jwtClient));
});
}
答案 2 :(得分:1)
谢谢!我还找到了另一种解决方案,以防其他人:
//在全球范围内进行身份验证。 var projectId = process.env.GCLOUD_PROJECT; //例如'葡萄飞船-123'
var gcloud = require(' google-cloud')({ projectId:projectId,
凭据:require(' ./ path / to / keyfile.json')
});
这样你就可以解构auth提供的整个json密钥
答案 3 :(得分:-1)
存储私钥i heroku而不带双引号,您的解决方案将起作用。