20

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

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不起作用,大概是因为它是多行。

有没有办法解决这个问题?

谢谢

4

7 回答 7

35

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

"private_key": process.env.GATSBY_GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'),
于 2019-04-01T16:33:51.390 回答
12

我正在添加一种对我有用的手动方法。步骤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将正确输出。

于 2020-05-23T20:39:11.587 回答
7

对我有用的解决方案——在 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);

注意:您不需要在项目中提交/包含上述代码。这只是为了生成key的base64字符串。

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

PRIVATE_KEY = 'akgjhakdgjhasgf'

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

const key = Buffer.from(process.env.PRIVATE_KEY , 'base64').toString('ascii');
// Use key anywhere in your code.
于 2021-08-10T16:42:27.247 回答
5

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

  • 将 .pem 内容转换为 base64 格式
  • 将转换后的 base64 内容(这将是单行字符串)放入 .env 文件中
  • 现在将 env 变量解码为原始内容
于 2021-04-01T07:22:55.467 回答
3

原来我的 .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,
        }
    }
}

于 2019-04-02T10:22:59.020 回答
1

您必须将环境变量加载到 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'
});
于 2019-04-02T03:16:10.517 回答
0

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

echo "export test_key=\"`sed -E 's/$/\\\n/g' ./gitbu.2018-03-23.private-key.pem`\"" >> .env
于 2019-04-01T16:40:45.233 回答