如何在没有 JSON 文件的情况下在 Heroku 上使用 Google 默认凭据?
How can I use Google default credentials on Heroku without the JSON file?
我正在寻求将 Node 应用程序部署到 Heroku,我 运行 遇到的主要挑战与 Node 的 Google 默认授权工作流程有关。默认情况下,Google 查找带有密钥的 JSON 文件,其中 GOOGLE_APPLICATION_CREDENTIALS
作为指向此 JSON 文件路径的环境变量名称。这对于本地开发来说很好,但在生产中我自然不想将这个敏感的 JSON 文件提交给源代码。 Heroku 允许您创建环境变量,但每个变量都是独立的。我需要以某种方式将这个 JSON 文件分解成单独的变量,但我不知道如何称呼它们以便 Google 识别它们。
,但等效项在 Node 中不起作用。
getApplicationDefault
方法实际上只是一个寻找合适客户的便利工厂。你实际上可以 construct your client directly, passing in the parameters read from 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));
});
}
谢谢!我还找到了另一种解决方案,以防对其他人有所帮助:
// 在全球范围内进行身份验证。
var projectId = process.env.GCLOUD_PROJECT; // 例如'grape-spaceship-123'
var gcloud = require('google-cloud')({
项目编号:项目编号,
凭证:要求('./path/to/keyfile.json')
});
这样你就可以解构 auth
提供的整个 json 密钥
当使用googlet运行slationapi时,我运行进入同样的问题。我无法引用整个 JSON 文件,所以我在 Heroku 中创建了两个环境变量并在凭证对象中引用了它们。你不能让他们孤立无援。私钥的 .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
}
});
在没有双引号的情况下存储私钥 i heroku,您的解决方案将起作用。
我刚刚遇到了同样的问题,在网上找不到可以开始工作的解决方案,所以我自己做了一个。我知道这是一个老问题,但想分享一下,这样其他人可能会发现它。
为了解决这个问题,我使用 Node JS 在部署后通过访问环境变量中的密钥值以编程方式将文件写入主机。
首先,我在我的 JS 代码中创建了一个对象作为 JSON 模板,并使用正确的键名并使用我的环境变量来获取该对象中的键值。准备好该模板后,我几乎可以让 Node 将文件写入主机,但我有一个问题需要解决。
我发现 from another post JSON.stringify()
会将来自环境变量的任何反斜杠 ('') 修改为两个反斜杠 ('\')(它不会在反斜杠时进行此更改来自 JavaScript 对象中的字符串)。这对我来说是个问题,因为我的私钥有 28 个反斜杠。要纠正此问题,如上文 link 中所述,我检索了环境变量的值并更新了对象,然后再将对象传递给 JSON.stringify()
.
解决该问题后,我能够将文件写入主机并成功部署我的应用程序,而无需在我的 public 存储库中公开我的 JSON 文件。
const fs = require('fs');
async function createJSONFile() {
//Replace '\' in environment variable .env file before JSON.stringify()
//so that stringify does not turn it into '\'
//
jsonFile.private_key = process.env.GCS_JSON_private_key.replace(/\n/g, '\n');
let data = JSON.stringify(jsonFile);
//CHECK IF JSON KEYFILE FOR GCS EXISTS. IF NOT, CREATES FILE
if (!fs.existsSync(`./${process.env.GCS_KEYFILE}`)) {
await fs.writeFile(`./${process.env.GCS_KEYFILE}`, data, function (err) {
if (err) {
return res.status(400).json(err);
}
});
}
}
//JSON file template
let jsonFile = {
type: `${process.env.GCS_JSON_type}`,
project_id: `${process.env.GCS_JSON_project_id}`,
private_key_id: `${process.env.GCS_JSON_private_key_id}`,
private_key: `${process.env.GCS_JSON_private_key}`,
client_email: `${process.env.GCS_JSON_client_email}`,
client_id: `${process.env.GCS_JSON_client_id}`,
auth_uri: `${process.env.GCS_JSON_auth_uri}`,
token_uri: `${process.env.GCS_JSON_token_uri}`,
auth_provider_x509_cert_url: `${process.env.GCS_JSON_auth_provider_x509_cert_url}`,
client_x509_cert_url: `${process.env.GCS_JSON_client_x509_cert_url}`,
};
createJSONFile();
我正在寻求将 Node 应用程序部署到 Heroku,我 运行 遇到的主要挑战与 Node 的 Google 默认授权工作流程有关。默认情况下,Google 查找带有密钥的 JSON 文件,其中 GOOGLE_APPLICATION_CREDENTIALS
作为指向此 JSON 文件路径的环境变量名称。这对于本地开发来说很好,但在生产中我自然不想将这个敏感的 JSON 文件提交给源代码。 Heroku 允许您创建环境变量,但每个变量都是独立的。我需要以某种方式将这个 JSON 文件分解成单独的变量,但我不知道如何称呼它们以便 Google 识别它们。
getApplicationDefault
方法实际上只是一个寻找合适客户的便利工厂。你实际上可以 construct your client directly, passing in the parameters read from 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));
});
}
谢谢!我还找到了另一种解决方案,以防对其他人有所帮助:
// 在全球范围内进行身份验证。 var projectId = process.env.GCLOUD_PROJECT; // 例如'grape-spaceship-123'
var gcloud = require('google-cloud')({ 项目编号:项目编号,
凭证:要求('./path/to/keyfile.json')
});
这样你就可以解构 auth
提供的整个 json 密钥当使用googlet运行slationapi时,我运行进入同样的问题。我无法引用整个 JSON 文件,所以我在 Heroku 中创建了两个环境变量并在凭证对象中引用了它们。你不能让他们孤立无援。私钥的 .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
}
});
在没有双引号的情况下存储私钥 i heroku,您的解决方案将起作用。
我刚刚遇到了同样的问题,在网上找不到可以开始工作的解决方案,所以我自己做了一个。我知道这是一个老问题,但想分享一下,这样其他人可能会发现它。
为了解决这个问题,我使用 Node JS 在部署后通过访问环境变量中的密钥值以编程方式将文件写入主机。
首先,我在我的 JS 代码中创建了一个对象作为 JSON 模板,并使用正确的键名并使用我的环境变量来获取该对象中的键值。准备好该模板后,我几乎可以让 Node 将文件写入主机,但我有一个问题需要解决。
我发现 from another post JSON.stringify()
会将来自环境变量的任何反斜杠 ('') 修改为两个反斜杠 ('\')(它不会在反斜杠时进行此更改来自 JavaScript 对象中的字符串)。这对我来说是个问题,因为我的私钥有 28 个反斜杠。要纠正此问题,如上文 link 中所述,我检索了环境变量的值并更新了对象,然后再将对象传递给 JSON.stringify()
.
解决该问题后,我能够将文件写入主机并成功部署我的应用程序,而无需在我的 public 存储库中公开我的 JSON 文件。
const fs = require('fs');
async function createJSONFile() {
//Replace '\' in environment variable .env file before JSON.stringify()
//so that stringify does not turn it into '\'
//
jsonFile.private_key = process.env.GCS_JSON_private_key.replace(/\n/g, '\n');
let data = JSON.stringify(jsonFile);
//CHECK IF JSON KEYFILE FOR GCS EXISTS. IF NOT, CREATES FILE
if (!fs.existsSync(`./${process.env.GCS_KEYFILE}`)) {
await fs.writeFile(`./${process.env.GCS_KEYFILE}`, data, function (err) {
if (err) {
return res.status(400).json(err);
}
});
}
}
//JSON file template
let jsonFile = {
type: `${process.env.GCS_JSON_type}`,
project_id: `${process.env.GCS_JSON_project_id}`,
private_key_id: `${process.env.GCS_JSON_private_key_id}`,
private_key: `${process.env.GCS_JSON_private_key}`,
client_email: `${process.env.GCS_JSON_client_email}`,
client_id: `${process.env.GCS_JSON_client_id}`,
auth_uri: `${process.env.GCS_JSON_auth_uri}`,
token_uri: `${process.env.GCS_JSON_token_uri}`,
auth_provider_x509_cert_url: `${process.env.GCS_JSON_auth_provider_x509_cert_url}`,
client_x509_cert_url: `${process.env.GCS_JSON_client_x509_cert_url}`,
};
createJSONFile();