如何在没有JSON文件的情况下在Heroku上使用Google默认凭据?

时间:2017-04-14 04:45:54

标签: node.js heroku google-api google-authentication

我正在寻找将一个Node应用程序部署到Heroku,而我遇到的主要挑战与Node的Google默认授权工作流程有关。默认情况下,Google会查找带有密钥的JSON文件,其中GOOGLE_APPLICATION_CREDENTIALS作为指向此JSON文件路径的环境变量名称。这对于本地开发来说很好,但在生产中我自然不希望将这个敏感的JSON文件提交到源代码。 Heroku允许您创建环境变量,但每个变量都是个体的。不知何故,我需要将这个JSON文件分解为单独的变量,但我不知道如何将它们称为Google以识别它们。

There is a similar thread on this for Ruby,但等效在Node中不起作用。

4 个答案:

答案 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而不带双引号,您的解决方案将起作用。