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

use*_*334 6 google-api heroku google-authentication node.js

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

对于Ruby,有一个类似的线程,但是等效的在Node中不起作用.

use*_*645 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
  }
});
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 3

getApplicationDefault方法实际上只是寻找合适客户的便利工厂。实际上,您可以直接构造您的客户端,传入从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));
    });
}
Run Code Online (Sandbox Code Playgroud)