在 .env 文件中使用私钥

Using private key in a .env file

我在 gatsby .env 文件中有一个多行私钥:

GATSBY_GOOGLE_CLIENT_ID="12345"
GATSBY_GOOGLE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nflkdflkdf...\n-----END PRIVATE KEY-----"

在我的 gatsby-config 文件中我有:

module.exports = {
    resolve: 'gatsby-source-google-sheets',
    options: {
        credentials: {
            "type": "service_account",
            "private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY,
            "client_id": process.env.GATSBY_GOOGLE_CLIENT_ID
        }
    }
}

client_id 工作正常,因为它只是一行字符串,但 private_key 不起作用,大概是因为它是多行。

我有办法解决这个问题吗?

谢谢

您可以使用 string.replace 和正则表达式,如下所示再次转义 \n 字符:

"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\n/g, '\n'),

放入 pem 文件,然后将其替换为您的 .env

echo "export test_key=\"`sed -E 's/$/\\n/g' ./gitbu.2018-03-23.private-key.pem`\"" >> .env

您必须将环境变量加载到 gatsby 中。最简单的方法是使用 dotenv:

设置:

yarn add -D dotenv # or npm install -D dotenv

然后在你的 gatsby-config.js:

require('dotenv').config();

module.exports = {
  plugins: [ ... ]
}

如果您的文件名与.env不同或者您将其存储在不同的位置,您可以传入一个路径选项:

require('dotenv').config({
  path: 'path/to/env/file'
});

原来我的 .env 路径不正确。出于某种原因,其他密钥有效,但私钥无效。

正确的设置:

require("dotenv").config({
    path: `./.env.${process.env.NODE_ENV}`,
});
const private_key = process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\n/g, '\n');

module.exports = {
    resolve: 'gatsby-source-google-sheets',
    options: {
        credentials: {
            "private_key": private_key,
        }
    }
}

我正在添加一种对我有用的手动方法。 第 1 步:

echo "PRIVATE_KEY=\"`sed -E 's/$/\\n/g' my_rsa_2048_priv.pem`\"" >> .env

.env 文件中的密钥将如下所示:

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n
dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
-----END RSA PRIVATE KEY-----\n"

第 2 步。在您的代码中打印值 process.env.PRIVATE_KEY 只会显示第一行:-----BEGIN RSA PRIVATE KEY-----\n。要解决此问题,请将 .env 中的变量编辑为一行。像这样:

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"

现在process.env.PRIVATE_KEY可以正确输出

我有类似的问题,我必须读取 .pem 文件内容。以下方法对我有用。

  • 将.pem内容转换为base64格式
  • 将转换后的 base64 内容(这将是单行字符串)放入 .env 文件
  • 现在将环境变量解码为原始内容

对我有用的解决方案 -- 在 base 64 中编码私钥

第 1 步 - 将密钥转换为 Base 64

// Run this code in a JS file on your Dev Machine.
const privateKey= `-----BEGIN PRIVATE KEY-----\nMIIEvSomeMoreCharacterHererplw==\n-----END PRIVATE KEY-----\n`
const buff = Buffer.from(privateKey).toString('base64');
console.log(buff);

注意:您的项目中不需要commit/include上述代码。这只是为了生成密钥的base64字符串。

步骤 2 - 将控制台日志数据复制到 .env 文件

PRIVATE_KEY = 'akgjhakdgjhasgf'

第 3 步 - 使用代码中的密钥

const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.