2017-04-14 48 views
3

我正在寻找将节点应用程序部署到Heroku,并且我遇到的关键挑战与Node的Google默认授权工作流程有关。默认情况下,Google会使用密钥查找JSON文件,其中GOOGLE_APPLICATION_CREDENTIALS作为指向此JSON文件路径的环境变量名称。这对于本地开发很好,但在生产中我自然不想提交这个敏感的JSON文件来源。 Heroku允许您创建环境变量,但每个变量都是单独的。不知何故,我需要将这个JSON文件分解成单个变量,但我不知道该怎么称呼它们让Google识别它们。如何在没有JSON文件的情况下在Heroku上使用Google默认凭据?

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

回答

2

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)); 
    }); 
} 
1

的感谢!我还发现另一种解决方案,以帮助其他人:

//全球认证。 var projectId = process.env.GCLOUD_PROJECT; //例如'葡萄飞船-123'

变种gcloud =要求( '谷歌云')({ 专案编号:专案编号,

凭证:要求( './路径/到/ keyfile.json')

});

这种方式,您可以通过解构权威性

0

提供在使用谷歌翻译API整个JSON的关键,我遇到了同样的问题。我无法引用整个JSON文件,因此我在Heroku中创建了两个env变量,并在凭证对象中引用它们。你不能让他们独立。私钥的替换是一个重要的细节。你应该像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 
    } 
}); 
相关问题